Programmer's Reference Guide
| Exceptions avec MVC |
Migrer depuis des versions précédentes
L'API des composants MVC a changé plusieurs fois. Si vous avez débuté avec des versions antérieures du Zend Framework, suivez les recommandations suivantes pour migrer vos scripts afin d'utiliser la nouvelle architecture.
Migrer de la version 1.5.x vers 1.6.0 ou plus récent
Changement dans l'interface Dispatcher
Les utilisateurs ont porté à notre connaissance le fait que Zend_Controller_Front et
Zend_Controller_Router_Route_Module utilisent tous les deux des méthodes du dispatcheur qui ne
sont pas dans l'interface associée. Nous avons donc ajouté les trois méthodes suivantes pour s'assurer que
les dispatcheurs personnalisés continueront à fonctionner avec les implémentations embarquées :
-
getDefaultModule(): retourne le nom du module par défaut. -
getDefaultControllerName(): retourne le nom du contrôleur par défaut. -
getDefaultAction(): retourne le nom de l'action par défaut.
Migrer de la version 1.0.x vers 1.5.0 ou plus récent
Bien que la plupart des fonctionnalités de base demeurent les mêmes, et que toutes les fonctionnalités documentées restent les mêmes, il existe une "fonctionnalité" particulière non documentée qui a changé.
Quand vous écrivez des URLs, la manière documentée d'écrire les noms d'action en notationCamel est d'utiliser un séparateur de mot ; ceux ci sont "." ou "-" par défaut, mais ils peuvent être configurés dans le dispatcheur. Le dispatcheur en interne transforme les noms d'action en minuscules, et utilise ces séparateurs de mots pour ré-assembler la méthode d'action en utilisant la notationCamel. Cependant, comme les fonctions PHP ne sont pas sensibles à la casse, vous pouvez toujours écrire les URLs en utilisant la notationCamel, et le dispatcheur les résoudra de la même manière. Par exemple, "notation-camel" deviendra "notationCamelAction" dans le dispatcheur, tandis que "notationCamel" deviendra "notationcamelAction" ; cependant, à cause de l'insensibilité à la casse de PHP, dans les deux cas cela exécutera la même méthode.
Ceci pose des problèmes avec le ViewRenderer lors de la résolution des scripts de vue. La
manière canonique et documentée est que tous les séparateurs de mot sont convertis en tirets, et les mots en
minuscules. Ceci crée un lien sémantique entre les actions et les scripts de vue, et la normalisation s'assure
que les scripts peuvent être trouvés. Cependant, si l'action "notationCamel" est appelée et est résolue, le
séparateur de mot n'est pas pour autant présent, et le ViewRenderer tente de résoudre un
emplacement différent - "notationcamel.phtml" au lieu de "notation-camel.phtml".
Quelques développeurs se sont fondés sur ce "dispositif", qui n'a jamais été prévu. Plusieurs changements
de l'arbre 1.5.0, cependant, l'ont fait de sorte que le ViewRenderer ne résout plus ces chemins ;
le lien sémantique est maintenant imposé. A partir de maintenant, le dispatcheur impose la sensibilité à la
casse dans les noms d'action. Ceci veut dire que la référence vers vos actions dans l'URL en utilisant la
notationCamel ne résoudra plus les mêmes méthodes qu'en utilisant les séparateurs de mots (par ex.,
"notation-camel"). Ceci entraîne qu'à partir de maintenant le ViewRenderer honorera seulement les
actions en "mots-séparés" lors de la résolution des scripts de vue.
Si vous constatez que vous comptiez sur ce "dispositif", vous avez plusieurs options :
-
Meilleure option : renommez vos scripts de vue. Pour : compatibilité ascendante. Contre : si vous avez beaucoup de scripts de vue basés sur l'ancien, comportement fortuit, vous aurez beaucoup de renommage à faire.
-
Seconde meilleure option : le
ViewRendererdélégue maintenant la résolution des scripts de vue àZend_Filter_Inflector; vous pouvez modifier les règles de l'inflecteur pour ne plus séparer les mots d'une action avec un tiret :$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $inflector = $viewRenderer->getInflector(); $inflector->setFilterRule(':action', array( new Zend_Filter_PregReplace( '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i', '' ), 'StringToLower' ));Le code ci-dessus modifiera l'inflecteur pour ne plus séparer les mots avec un tiret ; vous pouvez aussi vouloir supprimer le filtre
StringToLowersi vous voulez que vos scripts de vues utilisent aussi la notationCamel.Si le renommage de vos scripts de vue est trop fastidieux ou nécessite trop de temps, ceci est la meilleure option avant de trouver le temps de le faire.
-
Option la moins souhaitable : vous pouvez forcer le dispatcheur à dispatcher les noms d'action écrits en notationCamel avec un nouveau drapeau du contrôleur frontal,
useCaseSensitiveActions:$front->setParam('useCaseSensitiveActions', true);Ceci vous permettra d'utiliser la notationCamel dans l'URL et de toujours faire résoudre la même action que si vous utilisez les séparateurs de mots. Cependant, ceci signifiera que les problèmes décrits ci-dessus interviendront tôt ou tard ; vous devrez probablement utiliser la deuxième option ci-dessus en plus de celle-ci pour que tout fonctionne correctement.
Notez, de plus, que l'utilisation de ce drapeau déclenchera une
noticeindiquant que cette utilisation est dépréciée.
Migrer de la version 0.9.3 vers 1.0.0RC1 ou plus récent
Les principaux changements introduits dans la version 1.0.0RC1 sont l'ajout et l'activation par défaut du plugin ErrorHandler et de l'aide d'action ViewRenderer. Veuillez lire la documentation de chacun des éléments directement pour apprendre leur fonctionnement et quels effets, ils peuvent avoir sur vos applications.
Le plugin ErrorHandler est exécuté pendant postDispatch() vérifiant la présence
d'exceptions, et redirigeant vers le contrôleur de gestion d'erreur spécifié. Vous pouvez le désactiver en
réglant le paramètre noErrorHandler du contrôleur frontal :
$front->setParam('noErrorHandler', true);
L'aide d'action ViewRenderer automatise l'injection de vues dans les contrôleurs d'action en
tant qu'autogénération des scripts de vues suivant l'action courante. Le principal problème que vous pourriez
rencontrer intervient quand vous avez des actions qui ne rendent pas de scripts de vues ni ne font suivre ou
redirige, alors ViewRenderer va tenter de rendre un script de vue basé sur le nom de
l'action.
Il existe plusieurs possibilités pour mettre à jour votre code. Dans un premier temps, vous pouvez
globalement désactiver ViewRenderer dans votre fichier d'amorçage du contrôleur frontal avant tout
dispatching :
// En considérant que $front est une instance de Zend_Controller_Front
$front->setParam('noViewRenderer', true);
Cependant, ceci n'est pas une bonne stratégie à long terme, car il apparaît aisément que vous devrez écrire plus de code.
Quand vous serez prêt à utiliser la fonctionnalité ViewRenderer, il y a plusieurs choses à
vérifier dans votre code de contrôleur. Premièrement, regardez vos méthodes d'actions (les méthodes se terminant
par "Action"), et déterminez ce que chacune d'elle réalise. Si rien de ce qui suit n'est réalisé, vous devrez
réaliser des changements :
-
Appel de
$this->render() -
Appel de
$this->_forward() -
Appel de
$this->_redirect() -
Appel de l'aide d'action
Redirector
Le changement le plus simple est la désactivation de l'auto-rendu pour cette méthode :
$this->_helper->viewRenderer->setNoRender();
Si vous trouvez qu'aucune de vos méthodes d'actions n'effectue de rendu, ne font suivre, ou redirige, vous
pouvez préférer mettre la ligne suivante dans la méthode preDispatch() ou init()
:
public function preDispatch()
{
// désactive l'auto-rendu des scripts de vues
$this->_helper->viewRenderer->setNoRender()
// ... faire autre chose ...
}
Si vous appelez render(), et que vous utilisez la structure de dossier modulaire conventionnelle, vous voudrez modifier
votre code pour utiliser l'auto-rendu :
-
Si vous rendez de multiples scripts de vues dans une seule action, vous n'avez rien à modifier.
-
Si vous appelez simplement
render()sans aucun argument, vous pouvez effacer ces lignes. -
Si vous appelez
render()avec des arguments, et que vous ne réalisez pas ensuite d'exécution de code ou effectuez le rendu de scripts de vues multiples, vous pouvez changer ces appels par$this->_helper->viewRenderer().
Si vous n'utilisez pas la structure de dossier modulaire conventionnelle, il existe une variété de
méthodes pour paramétrer le chemin de base des vues et les spécifications du chemin vers les scripts ainsi vous
pourrez utiliser ViewRenderer. Veuillez lire la documentation de ViewRenderer pour plus
d'informations sur ces méthodes.
Si vous utilisez un objet de vue issu du registre, ou que vous personnalisez votre objet vue, ou que vous
utilisez une implémentation de vue différente, vous pouvez vouloir injecter ViewRenderer dans cet
objet. Ceci peut être réalisé facilement à tout moment.
-
Avant le dispatching d'une instance de contrôleur frontal :
// En considérant que $view a déjà été définie $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view); Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
-
A tout moment durant le processus d'amorçage :
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->setView($view);
Il existe plusieurs manières de modifier ViewRenderer, incluant le réglage d'un script de vue
différent à rendre, la spécification d'un remplaçant pour tous les éléments remplaçables d'un chemin de script
de vues (incluant le suffixe), le choix d'un segment nommé de la réponse à utiliser, et plus encore. Si vous
n'utilisez pas la structure de dossier modulaire conventionnelle, vous pouvez tout de même associer différentes
spécifications de chemin à ViewRenderer.
Nous vous encourageons à adapter votre code pour utiliser ErrorHandler et
ViewRenderer puisqu'il s'agit maintenant de fonctionnalités natives.
Migrer de la version 0.9.2 vers 0.9.3 ou plus récent
0.9.3 introduit les aides d'actions. En lien avec ce changement, les méthodes suivantes ont été effacées puisqu'elles sont maintenant encapsulées dans l'aide d'action redirector :
-
setRedirectCode()à remplacer parZend_Controller_Action_Helper_Redirector::setCode(). -
setRedirectPrependBase()à remplacer parZend_Controller_Action_Helper_Redirector::setPrependBase(). -
setRedirectExit()à remplacer parZend_Controller_Action_Helper_Redirector::setExit().
Lisez la documentation des aides d'actions pour plus d'informations sur la récupération ou la manipulation des objets "helper", et la documentation du helper redirector pour plus d'informations sur le réglage des options de redirection (de même que pour les méthodes alternatives de redirection).
Migrer de la version 0.6.0 vers 0.8.0 ou plus récent
Pour les versions précédentes, l'utilisation basique des composants MVC reste la même :
Zend_Controller_Front::run('/chemin/vers/controleurs');
Cependant, la structure des dossiers a subi une réorganisation, certains composants ont été effacés, et d'autres ont été soit renommés soit ajoutés. Les changements incluent :
-
Zend_Controller_Routera été effacé en faveur du routeur de réécriture ("rewrite router"). -
Zend_Controller_RewriteRoutera été renommé enZend_Controller_Router_Rewrite, et promu en tant que routeur standard fourni avec le framework ;Zend_Controller_Frontl'utilise par défaut si aucun autre routeur n'est fourni. -
Une nouvelle classe de route à utiliser avec le routeur de réécriture a été introduite,
Zend_Controller_Router_Route_Module; elle couvre la route par défaut utilisée par le MVC, et supporte les modules de contrôleurs. -
Zend_Controller_Router_StaticRoutea été renommé enZend_Controller_Router_Route_Static. -
Zend_Controller_Dispatchera été renommé enZend_Controller_Dispatcher_Standard. -
Les arguments de
Zend_Controller_Action::_forward()ont changés. La signature est maintenant :final protected function _forward($action, $controller = null, $module = null, array $params = null);
$actionest toujours obligatoire ; si aucun contrôleur n'est spécifié, une action dans le contrôleur courant est considérée.$moduleest toujours ignoré à moins que$controllerne soit spécifié. Pour finir, tout$paramsfourni sera ajouté à l'objet requête. Si aucun contrôleur ou module n'est nécessaire, mais que des paramètres le sont, passez simplementnullpour ces valeurs.
Migrer de la version 0.2.0 ou plus ancien vers 0.6.0
L'utilisation de base des composants MVC n'a pas changé ; vous pouvez toujours faire comme suit :
Zend_Controller_Front::run('/chemin/vers/controleurs');
/* -- créer un routeur -- */
$router = new Zend_Controller_RewriteRouter();
$router->addRoute('user', 'user/:username', array('controller' => 'user',
'action' => 'info'));
/* -- l'affecter à un contrôleur -- */
$ctrl = Zend_Controller_Front::getInstance();
$ctrl->setRouter($router);
/* -- régler le répertoire des contrôleurs et dispatcher -- */
$ctrl->setControllerDirectory('/chemin/vers/controleurs');
$ctrl->dispatch();
Nous encourageons l'utilisation de l'objet Réponse pour agréger le contenu et les entêtes. Ceci permet un
basculement plus flexible entre les formats d'affichage (par exemple, JSON ou XML au lieu de XHTML) dans vos
applications. Par défaut, dispatch() va effectuer le rendu de la réponse, envoyant à la fois les
entêtes et tout contenu. Vous pouvez aussi avoir le contrôleur frontal qui retourne la réponse en utilisant
returnResponse(), et qui ensuite effectue le rendu de la réponse suivant votre propre logique. Une
version future du contrôleur frontal peut mettre en application l'utilisation de l'objet Réponse via la » bufferisation de sortie.
Il existe beaucoup d'autres fonctionnalités qui étendent l'API existante, et celles-ci sont décrites dans la documentation.
Le changement le plus important auquel vous devrez faire attention apparaîtra quand vous tenterez de sous-classer les différents composants. La clé se trouve ci-dessous :
-
Zend_Controller_Front::dispatch()intercepte par défaut les exceptions dans l'objet réponse, et ne les affiche pas, afin d'éviter l'affichage d'information sensible du système. Vous pouvez surcharger ceci de différentes manières :-
Régler
throwExceptions()dans le contrôleur frontal :$front->throwExceptions(true);
-
Régler
renderExceptions()dans l'objet Réponse :$response->renderExceptions(true); $front->setResponse($response); $front->dispatch(); // ou : $front->returnResponse(true); $response = $front->dispatch(); $response->renderExceptions(true); echo $response;
-
-
Zend_Controller_Dispatcher_Interface::dispatch()accepte maintenant et retourne un objet L'objet Requête au lieu d'un élément du dispatcheur. -
Zend_Controller_Router_Interface::route()accepte maintenant et retourne un objet L'objet Requête au lieu d'un élément du dispatcheur. -
Les changements de
Zend_Controller_Actionincluent :-
Le constructeur accepte maintenant exactement trois arguments,
Zend_Controller_Request_Abstract $request,Zend_Controller_Response_Abstract $response, et le tableau facultatif$params.Zend_Controller_Action::__construct()les utilise pour affecter la requête, la réponse, et les propriétésinvokeArgsde l'objet, et si vous devez surcharger le constructeur, vous devez faire de même. La meilleure solution est d'utiliser la méthodeinit()pour réaliser toute configuration de l'instance, puisque cette méthode est appelée en tant que action finale du constructeur. -
run()n'est plus défini en tant qu'élément final, mais n'est pas non plus utilisé par le contrôleur frontal ; son seul but apparaît lors de l'utilisation de la classe en tant que contrôleur de page. Il prend maintenant deux arguments facultatifs, unZend_Controller_Request_Abstract $requestet unZend_Controller_Response_Abstract $response. -
indexAction()ne nécessite plus d'être défini, mais est recommandé en tant qu'action par défaut. Ceci permet lors de l'utilisation deRewriteRouteret des contrôleurs d'action de spécifier différentes méthodes d'action par défaut. -
__call()peut être surchargé pour gérer automatiquement les actions non définies. -
_redirect()prend maintenant un second paramètre facultatif, le code HTTP à retourner avec la redirection, et un troisième paramètre optionnel,$prependBase, qui peut indiquer que l'URL de base enregistré avec l'objet requête peut être ajouté en tant que suffixe à l'URL spécifié. -
La propriété
_actionn'existe plus. Cette propriété était unZend_Controller_Dispatcher_Token, qui n'existe plus maintenant. Le seul but de cet élément est de fournir l'information concernant le contrôleur, l'action et les paramètres d'URL de la requête. Cette information est maintenant disponible dans l'objet requête, et peut être interrogé comme ceci :// Récupère le nom de controleur de la requête // L'accès se fait via : $this->_action->getControllerName(). // L'exemple ci-dessous utilise getRequest(), bien que vous pourriez accéder directement // à la propriété $_request ; l'utilisation de getRequest() est recommandée puisue la classe // parente peut surcharger l'accès à l'objet requête. $controller = $this->getRequest()->getControllerName(); // Recupere le nom de l'action de la requete // L'acces se fait via : $this->_action->getActionName(). $action = $this->getRequest()->getActionName(); // Recupere les parametres de la requete // Ceci n'a pas changé ; les methodes _getParams() and _getParam() relaient simplement // l'objet requete maintenant. $params = $this->_getParams(); $foo = $this->_getParam('foo', 'default'); // parametre de la requete 'foo', en utilisant // 'default' en tant que valeur par défaut si aucune valeur n'est trouvée -
noRouteAction()a été effacée. La manière appropriée de gérer les méthodes d'actions non-existantes est de les router vers une action par défaut en utilisant__call():public function __call($method, $args) { // Si la méthode requetee ne correspond a aucune methode 'Action', on renvoie vers la méthode d'action par défaut : if ('Action' == substr($method, -6)) { return $this->defaultAction(); } throw new Zend_Controller_Exception('Appel de methode invalide'); }
-
-
Zend_Controller_RewriteRouter::setRewriteBase()a été effacée. Utilisez plutôtZend_Controller_Front::setBaseUrl()(ou Zend_Controller_Request_Http::setBaseUrl(), si vous utilisez cette classe de requête). -
Zend_Controller_Plugin_Interfacea été remplacée parZend_Controller_Plugin_Abstract. Toutes les méthodes acceptent et retournent maintenant un objet L'objet Requête au lieu d'un élément du dispatcheur.
| Exceptions avec MVC |
Select a Version
Languages Available
Components
Search the Manual
Navigation
- Guide de référence du programmeur
- Guide de référence du programmeur
- Zend_Controller
- Zend_Controller - Démarrage rapide
- Fondations de Zend_Controller
- Le contrôleur frontal (Front Controller)
- L'objet Requête
- Routeur Standard
- Le dispatcheur
- Contrôleurs d'action
- Aides d'action (Helper)
- Objet de réponse
- Plugins
- Utilisation de conventions de dossiers modulaires
- Exceptions avec MVC
- Migrer depuis des versions précédentes
