login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Zend ErrorController (Opgelost)

Offline juul - 10/06/2008 14:26
Avatar van juulHTML interesse Ik ben nog een begonnen met Zend en ik wil dus een kleine cms gaan schrijven als dat lukt ga ik hem afmaken en gebruiken.

Nu heb ik dit in de bootstrap staan:
  1. require_once "Zend/Loader.php";
  2. Zend_Loader::registerAutoload();


Dit zou dus naar mijn weten ook de error plugin moeten laden blijkbaar niet want als ik doe:
  1. $frontController = Zend_Controller_Front::getInstance();
  2. $frontController->setErrorHandlerModule('cms')


Dan doed vind hij die functie niet... En ik krijg dus ook al helemaal geen error pagina. De error controller staat waar hij moet staan dus normaal zou ik toch met die setErrorHandlerModule een error pagina moeten krijgen.

13 antwoorden

Gesponsorde links
Offline Stijn - 10/06/2008 15:07 (laatste wijziging 10/06/2008 15:07)
Avatar van Stijn PHP expert De autoLoad functie include enkel bestanden bij de keyword new. Je moet dus onder require het volgende zetten:

  1. Zend_Loader::loadClass('Zend_Controller_Front');


Zorg ook dat je PHP.net: set_include_path ingestelt is.
Offline juul - 10/06/2008 16:01
Avatar van juul HTML interesse
  1. <?php
  2. // Show every error
  3. error_reporting(E_ALL | E_STRICT);
  4. ini_set('display_startup_errors', 1);
  5. ini_set('display_errors', 1);
  6. //ini_set('display_startup_errors', 0);
  7. //ini_set('display_errors', 0);
  8.  
  9. // Add the zend library to the include path
  10. set_include_path('../library' . PATH_SEPARATOR . get_include_path());
  11.  
  12. // Auto load every class we need
  13. require_once "Zend/Loader.php";
  14. Zend_Loader::registerAutoload();
  15. Zend_Loader::loadClass('Zend_Controller_Front');
  16.  
  17. // Set up layout
  18. $layout = Zend_Layout::startMvc(array(
  19. 'layout' => 'default',
  20. 'layoutPath' => '../application/layouts',
  21. 'contentKey' => 'content',
  22. ));
  23.  
  24. // Set up front controller class
  25. $frontController = Zend_Controller_Front::getInstance();
  26. $frontController->throwExceptions(true);
  27. $frontController->addModuleDirectory('../application/modules');
  28. $frontController->setDefaultModule('index');
  29. $frontController->setErrorHandlerModule('cms');
  30. $frontController->dispatch();


Dit is nu alles wat ik heb en zonder
  1. $frontController->setDefaultModule('index');
werkt het ook niet.

Ik heb ook de controller ../application/modules/cms/controllers/errorController.php dus het zou toch moeten werken of ligt het toch aan mij 
Offline lemoinet - 10/06/2008 17:57
Avatar van lemoinet PHP gevorderde $frontController->throwExceptions(true); moet op false staan, anders ver de errorhandlermodule niet
Offline juul - 10/06/2008 18:17 (laatste wijziging 10/06/2008 19:19)
Avatar van juul HTML interesse Bedankt en waar moet de ->setDefaultModule dan komen? En in welke class zit die eigenlijk?

Want ik krijg nog de melding: Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' Wat er dus op wijst dat ik enkel nog de module moet aanpassen of de controller en action maar normaal alleen de module.
Offline Stijn - 10/06/2008 22:01 (laatste wijziging 10/06/2008 22:01)
Avatar van Stijn PHP expert Je controller is verkeerd. De filename van de controller moet ErrorController.php zijn en de class:

  1. class CMS_ErrorController extends Zend_Controller_Action


Het zou best zijn om je module cms in hoofdletters te typen, zo volg je de OO regels.

Mocht dit nog niet lukken, probeer de volgende configuratie van je front controller.

  1. $frontController = Zend_Controller_Front::getInstance();
  2. $frontController->throwExceptions(true);
  3. $frontController->addModuleDirectory('../application/modules');
  4. $frontController->setErrorHandler( array('module' => 'cms' , 'controller' => 'error' , 'action' => 'index') );
  5.  
  6. $frontController->dispatch();
Offline juul - 11/06/2008 11:20 (laatste wijziging 12/06/2008 12:29)
Avatar van juul HTML interesse Met of zonder hoofdletter het werkt beide niet 

En die class had ik al juist hoor, is er ergens een lijstje met hoe je die hoofdletters moet gebruiken in ZF dat ik het mooi doe hoe het verwacht wordt.

En de setErrorHandler method vindt hij ook niet 
  1. <?php
  2. // Show every error
  3. error_reporting(E_ALL | E_STRICT);
  4. ini_set('display_startup_errors', 1);
  5. ini_set('display_errors', 1);
  6. //ini_set('display_startup_errors', 0);
  7. //ini_set('display_errors', 0);
  8.  
  9. // Add the zend library to the include path
  10. set_include_path('../library' . PATH_SEPARATOR . get_include_path());
  11.  
  12. // Auto load every class we need
  13. require_once "Zend/Loader.php";
  14. Zend_Loader::registerAutoload();
  15. Zend_Loader::loadClass('Zend_Controller_Front');
  16.  
  17. // Set up layout
  18. $layout = Zend_Layout::startMvc(array(
  19. 'layout' => 'default',
  20. 'layoutPath' => '../application/layouts',
  21. 'contentKey' => 'content',
  22. ));
  23.  
  24. // Set up front controller class
  25. $frontController = Zend_Controller_Front::getInstance();
  26. $frontController->throwExceptions(false);
  27. $frontController->addModuleDirectory('../application/modules');
  28. $frontController->setDefaultModule('index');
  29. $frontController->setErrorHandler(array('module' => 'cms', 'controller' => 'error', 'action' => 'index'));
  30. $frontController->dispatch();
Offline Stijn - 12/06/2008 13:37
Avatar van Stijn PHP expert Zend_Loader::loadClass('Zend_Layout'); en laat die registerAutoLoad() even weg.
Offline juul - 12/06/2008 15:25
Avatar van juul HTML interesse
  1. <?php
  2. // Show every error
  3. error_reporting(E_ALL | E_STRICT);
  4. ini_set('display_startup_errors', 1);
  5. ini_set('display_errors', 1);
  6. //ini_set('display_startup_errors', 0);
  7. //ini_set('display_errors', 0);
  8.  
  9. // Add the zend library to the include path
  10. set_include_path('../library' . PATH_SEPARATOR . get_include_path());
  11.  
  12. // Auto load every class we need
  13. require_once "Zend/Loader.php";
  14. //Zend_Loader::registerAutoload();
  15. Zend_Loader::loadClass('Zend_Layout');
  16.  
  17. // Set up layout
  18. $layout = Zend_Layout::startMvc(array(
  19. 'layout' => 'default',
  20. 'layoutPath' => '../application/layouts',
  21. 'contentKey' => 'content',
  22. ));
  23.  
  24. // Set up front controller class
  25. $frontController = Zend_Controller_Front::getInstance();
  26. $frontController->throwExceptions(false);
  27. $frontController->addModuleDirectory('../application/modules');
  28. $frontController->setDefaultModule('index');
  29. $frontController->getPlugin('Zend_Controller_Plugin_ErrorHandler');
  30. $frontController->setErrorHandler(array('module' => 'cms', 'controller' => 'error', 'action' => 'index'));
  31. $frontController->dispatch();

Fatal error: Call to undefined method Zend_Controller_Front::setErrorHandler() in \Zend\application\bootstrap.php
Offline Stijn - 12/06/2008 19:23
Avatar van Stijn PHP expert Zend_Loader::loadClass('Zend_Controller_Front');

Dat moet er ook nog bij hé.
Offline juul - 12/06/2008 20:10 (laatste wijziging 13/06/2008 19:37)
Avatar van juul HTML interesse Geen verandering 
Offline Stijn - 13/06/2008 19:51 (laatste wijziging 14/06/2008 16:44)
Avatar van Stijn PHP expert
  1. $frontController->getPlugin('ErrorHandler')->setErrorHandler(array('module' => 'cms', 'controller' => 'error', 'action' => 'index'));


De errorhandler is een controller plugin. Wanneer er exceptions getroffen zijn, wordt de errorHandler ingeroepen. Deze plugin maakt gebruik van postDispatch().
Offline juul - 14/06/2008 13:41 (laatste wijziging 17/06/2008 12:52)
Avatar van juul HTML interesse Dat werkt nog steeds niet maar het lijkt me eenvoudiger als ik even alles doorstuur misschien doe ik iets stom fout ofzo.

En als je dus nog tips hebt voor mij over dingen die je opvallen als je het allemaal snel bekijkt (map structuur, andere dingen enz...) dan mag je dat ook altijd zeggen.

Link removed
Offline Stijn - 16/06/2008 16:04 (laatste wijziging 16/06/2008 21:40)
Avatar van Stijn PHP expert Bij de dispatch() methode van de front controller worden de plugins: errorhandler en viewrenderer geladen. Als je de errorhandler plugin wilt laden moet je bij je front het volgende zetten.

  1. $frontController->setParam('noErrorHandler' , false);


*update*


Blijkbaar is dit geen ideale oplossing aangezien je de plugin niet kan configureren en hij ingeladen wordt tijdens het dispatch proces. Als je registerAutoload() nog staan hebt kan je het volgende gebruiken.

  1. $errorHandler = new Zend_Controller_Plugin_ErrorHandler();
  2. $errHandler->setErrorHandler( array('controller' => ... , 'action' => ... , 'module' => ...) );
  3. $frontController->registerPlugin( $errorHandler , 100 );
  4. $frontController->setParam('noErrorHandler' , true); //voor de veiligheid
  5.  
  6. //dispatch
  7. $frontController->dispatch();


Als je geen registerAutoload gebruikt moet je de class even inladen.

  1. Zend_Loader::loadClass('Zend_Controller_Plugin_ErrorHandler');


De reden waarom er 100 staat is omdat de errorhandler standaard op de 100ste plek staat van de stack, zo worden de events van de errorhandler als laatste opgeroepen.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.306s