août
2008
Je viens de créer un petit patch rapide et efficace concernant le plugin ZF MVC ErrorHandler
Lorsqu’il arrive dans une erreur, soit le contrôleur n’existait pas, soit l’action n’existait pas, soit il s’est passé autre chose.
Dans le premier cas, mon patch permet de dresser la liste des contrôleurs disponibles.
Dans le deuxième cas, mon patch permet de lister les methodes d’action disponibles du contrôleur.
Dans le dernier cas mon patch n’apporte rien.
Il rajoute en fait un attribut à l’objet $error, qu’il appelle ‘availableItems'; ainsi, le contrôleur d’erreur peut l’utiliser.
Il est même possible de lier ceci au Routeur, et de créer une liste d’URLs à proposer (« vous vouliez dire ceci ? »)
Le gros du travail est fait ici, ça mérite refactorisation et tests, si vous vous sentez :
$error->request = clone $request;
$fc = Zend_Controller_Front::getInstance();
$error->availableItems = array();
$dispatcher = $fc->getDispatcher();switch ($exceptionType) {
case ‘Zend_Controller_Dispatcher_Exception':
$error->type = self::EXCEPTION_NO_CONTROLLER;
if ($fc->hasPlugin(‘Zend_Controller_Plugin_ActionStack’)) {
array_push($error->availableItems, ‘Could not get action method names because of ActionStack’);
} else {
$controllerDir = $dispatcher->getControllerDirectory($error->request->getModuleName());
try {
$iterator = new DirectoryIterator($controllerDir);
} catch (Exception $e) {
array_push($error->availableItems, ‘Could not get controllers list because of a controller directory reading error’);
return;
}
foreach ($iterator as $file) {
if ($file->isDot() || $file->isDir() || substr((string)$file,-14,10) != « Controller ») {
continue;
}
array_push($error->availableItems, (string)$file);
}
}
break;
case ‘Zend_Controller_Action_Exception':
if ($fc->hasPlugin(‘Zend_Controller_Plugin_ActionStack’)) {
array_push($error->availableItems, ‘Could not get action method names because of ActionStack’);
} else {
try {
$class = $dispatcher->getControllerClass($error->request);
$class = @$dispatcher->loadClass($class);
} catch (Zend_Controller_Exception $e) {
array_push($error->availableItems, ‘Could not get action method names because of a dispatcher exception’);
return;
}
$reflectionClass = new ReflectionClass($class);
foreach($reflectionClass->getMethods() as $method) {
if ($method->isPublic() && substr($methodName = $method->getName(), -6) == ‘Action’) {
array_push($error->availableItems, $methodName);
}
}
}
Le patch est ici, pour ceux qui veulent profiter
Commentaires récents
Archives
- novembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007