Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour
Je me suis lancé dans zf2 en suivant le tuto sur el site officiel.
Tout marche mais mon soucis est quand j'essaye d'ajouter un controler.
Dans module.config.php j'ai bien ajouter :
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
'Application\Controller\Test' => 'Application\Controller\TestController',
),
),
J'ai créer le TestController.php et son index.phtml
Mais j'ai cette erreur quand je vais sur la page :
A 404 error occurred
Page not found.
The requested URL could not be matched by routing.
Qulqu'un peut il m'éclairer? svp
Merci
Dernière modification par Nirzol (25-01-2013 11:27:17)
Hors ligne
Salut la réponse est simple, si tu lis le message d'erreur qui t'es donné tu la trouves.
De plus cette question a déjà été posée donc un petit tour dans la recherche ça fait pas de mal .
Nirzol a écrit:
The requested URL could not be matched by routing.
Donc là ce qu'il se passe c'est que l'url que tu donnes ne correspond à aucune route.
Ce qui me vient à te poser la question, comment le framework ferait pour savoir quel url est associée à un contrôleur ? Il faut que tu lui dises à un moment donné.
Hors ligne
Quelle url appelles-tu ?
Pour peu que tu aies une action "index" dans ton testController, la route par défaut livrée avec le ZendSkeleton serait
application/test/index
C'est souvent l'oubli du 'application' au début qui put être déroutant.
Hors ligne
Bonjour
merci de vos réponses.
@okren justement ou lui dire cela ? Je n'ai pas trouver réponses qui résout mon problème
@jml44 oui c'est bien ça http://monsite.com/application/test marche
Par contre http:/monsite.com/album/test non le tuto proposé sur le site de zend
'ai l'erreur suivante en allant sur l'adresse
The requested controller was unable to dispatch the request.
Controller:
Album\Controller\Album
Merci
Dernière modification par Nirzol (14-01-2013 04:59:34)
Hors ligne
Tu as bien cette route dans ta configuration ?
[lang=php] 'controllers' => array( 'invokables' => array( 'Album\Controller\Album' => 'Album\Controller\AlbumController', ), ), // The following section is new and should be added to your file 'router' => array( 'routes' => array( 'album' => array( 'type' => 'segment', 'options' => array( 'route' => '/album[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Album\Controller\Album', 'action' => 'index', ), ), ), ), ),
Dernière modification par jml44 (14-01-2013 09:21:06)
Hors ligne
Nirzol a écrit:
@okren
Orkin
Nirzol a écrit:
Par contre http:/monsite.com/album/test non le tuto proposé sur le site de zend
'ai l'erreur suivante en allant sur l'adresse
The requested controller was unable to dispatch the request.
Controller:
Album\Controller\Album
La configuration par défaut des routes au niveau des contrôleurs est comme ceci :
nom-du-module/nom-du-controleur-sans-le-mot-controleur/nom-de-l-action-sans-le-mot-action
Donc à partir de là lorsque tu ajoutes un contrôleur dans un module tu dois suivre cette règle par défaut. Ce qui explique pourquoi ton testController qui se situe dans ton module application est accessible via http://monsite.com/application/test qui équivaut à http://monsite.com/application/test/index
Donc pour la partie album il faut déjà activé le module comme expliqué dans le tuto. Ensuite créer un contrôleur dans le module en question donc là Album, créer un contrôleur qui s'appelle TestController et une méthode indexAction pour que cette url fonctionne http://monsite.com/album/test
Ca c'est la partie par défaut qui est expliquée normalement dans le tutoriel ici http://framework.zend.com/manual/2.0/en … llers.html
Ensuite la configuration que tu as mis dans ton module.config.php pour les invokables ça permet de définir à ton service manager un alias pour tes contrôleurs test et index et de lui permettre de les instancier tout seul comme un grand lorsque l'url fait appelle à un de ces contrôleurs.
Ensuite cet alias tu peux l'utiliser pour récupérer le contrôleur via le service manager et/ou faire de la configuration dans le fichier module.config.php et notamment définir une route pour y accéder. Donc encore une fois dans ce tutoriel tu as une route pour le module Album de définie avec l'action et l'id qui sont optionnel et qui lorsqu'ils sont saisi (dans l'url) doivent respecter les regexp indiqué en contrainte.
Ensuite par défaut tu as le contrôleur qui est spécifié afin de savoir lequel utiliser, pour lui spécifier le contrôleur il faut utiliser l'alias renseigné ci-dessus dans la partie invokables du contrôleur en question. Les règles de nommage préconisent de donner le FQCN de la classe comme alias afin de savoir tout de suite à quoi on a affaire et surtout ne pas avoir à aller chercher quel alias on a pu donner.
Tu peux voir aussi que la route est de type segment et qu'il existe plusieurs type de route. Les moins gourmandes sont les literal car il n'y a pas de traitement à faire (regexp, lire l'url avec les paramètres optionnels ou non etc ...). Tu peux donc définir une route de A à Z en lui spécifiant de la même manière le contrôleur et l'index en utilisant une route de type literal.
Dans ce cas tu lui donnes un nom, dans le tutoriel elle s'appelle album, tu lui donnes un type dans le tutoriel segment mais tu peux mettre literal par exemple (dans ce cas pas d'url avec [:/monparam]), lui donner une route par exemple '/album/test' ou 'album/test' (je sais plus si faut mettre le /), un contrôleur et une action.
Je te laisse chercher un peu pour ça tu as la doc qui donne des exemples
Hors ligne
Désolé Orkin pour le pseudo mal écrit.
Merci à vous pour vos réponses.
@jml44 oui c'est comme ça le voici, c'est le module.config.php de Album
[lang=php] <?php return array( 'controllers' => array( 'invokables' => array( 'Album\Controller\Album' => 'Album\Controller\AlbumController', 'Album\Controller\Test' => 'Album\Controller\TestController', ), ), // The following section is new and should be added to your file 'router' => array( 'routes' => array( 'album' => array( 'type' => 'segment', 'options' => array( 'route' => '/album[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Album\Controller\Album', 'action' => 'index', ), ), ), ), ), 'view_manager' => array( 'template_path_stack' => array( 'album' => __DIR__ . '/../view', ), ), );
@Orkin
J'ai bien créer TestController dans Album dans son dossier Controller, j'ai fais exactement comme pour le dossier Application avec indexAction .
[lang=php] namespace Album\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class TestController extends AbstractActionController { public function indexAction() { return new ViewModel(); } }
J'ai aussi son index.phtml dans view/album/test
Et quand je vais sur monsite.com/album/test j'ai l'erreur cité avant.
En lisant ce que tu dis en gros il cherche l'action test de album? et non le controller test de album? :S
Ce qui parait logique Je suis un peu perdu avec se system de routes dans zf2
Hors ligne
Nirzol a écrit:
En lisant ce que tu dis en gros il cherche l'action test de album?
C'est exactement ça.
Pour l'instant, seule l'action "index" existe dans ton controller, donc l'erreur est normale.
Si tu veux accéder à quelque chose en album/test, il te faut une action testAction() et une vue 'test.phtml' dans le répertoire 'test' ,mais cela peut être changé en spécifiant le template de vue.
Ce qui au passage améliore les performances car il n'y a pas besoin d'interpoler le script de vue.
Dernière modification par jml44 (14-01-2013 13:44:43)
Hors ligne
Ok merci. Oui si je crée l'action cela marche bien.
Mais comment faire pour que mon nouveau controller soit pris en compte ?
Hors ligne
J'ai modifier mon module.config.php. Pouvez vous me dire si la manière de faire est correct svp?
En gros à la racine du site je gère les action de indexcontroller
monsite.com/action <-- de indexcontroller
Pour les autres controllers de Application, ils sont appelés comme cela :
monsite.com/application/controller/action
Quand pensez vous?
Ci-dessous mon code si cela peut aider.
[lang=php] return array( 'router' => array( 'routes' => array( 'home' => array( //'type' => 'segment', 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( // 'route' => '/[:action][/:id]', 'route' => '/', 'constraints' => array( //'action' => '[a-zA-Z][a-zA-Z0-9_-]*', //'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Application\Controller\Index', 'action' => 'index', ), ), ), 'application' => array( 'type' => 'segment', 'options' => array( //'route' => '/application[/:controller][/:action][/:id]', 'route' => '[/:controller][/:action][/:id]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ), 'defaults' => array( '__NAMESPACE__' => 'Application\Controller', 'controller' => 'Application', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'default' => array( 'type' => 'Wildcard', 'options' => array( ), ), ), ), ), ), 'service_manager' => array( 'factories' => array( 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', ), ), 'translator' => array( 'locale' => 'en_US', 'translation_file_patterns' => array( array( 'type' => 'gettext', 'base_dir' => __DIR__ . '/../language', 'pattern' => '%s.mo', ), ), ), 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', 'Application\Controller\Test' => 'Application\Controller\TestController', ), ), 'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), 'template_path_stack' => array( __DIR__ . '/../view', ), ), );
Dernière modification par Nirzol (16-01-2013 09:13:30)
Hors ligne
Salut, on a pas grand chose à en penser en fait c'est toi qui fait tes routes en fonction de tes besoins. Si tu penses que c'est pertinent de faire comme ça alors c'est correct sinon ça ne l'est pas.
Cependant je te conseil d'utiliser les routes de type literal le plus possible car moins gourmande en ressource (pas de regex à exécuter). Bien évidemment on ne peux pas tout faire avec par moment un type wilcard ou segment est nécessaire mais je préfère utiliser les routes de type literal au maximum puis faire des child routes pour préciser les petites portions d'url qui en ont besoin.
Pour que ton nouveau contrôleur soit pris en compte je pense que tu as trouvé et j'avais déjà donné la réponse plus haut mais je vais la redonner si d'autres ont des difficultés. Il faut l'ajouter dans la portion l'index invokables dédié aux contrôleurs dans le module.config.php
Hors ligne
Nirzol a écrit:
Pour les autres controllers de Application, ils sont appelés comme cela :
monsite.com/application/controller/action
Quand pensez vous?
La route par défaut 'application' est à mon avis une route de développement, mais tu devrais établir des routes plus spécifiques (et plus performantes) par la suite.
Hors ligne
Merci pour votre aide.
Dommages qu'il n'y est pas de best practice pour les routes.
Hors ligne
Il n'y a pas vraiment de best practice c'est à chacun de faire comme il le souhaite et en fonction de l'application. Une application qui va être destinée à très peu d'utilisateurs avec très peu de route peut surement utiliser les routes génériques par contre une application plus gourmande pourrait voir ses performance diminuer du fait qu'en plus de ça il y a surement des bouts de code à exécuter à chaque requête (pour récupérer la conf, des infos à droite à gauche etc ...)
Hors ligne
Oui tu as raison orkin. Du coup, j'ai un peu modifier mes routes pour éviter d'avoir des segments.
Ainsi monsite.com/controller/action <-- voila comment je vais gérer, ce qui me parait + logique comme je faisait avec ZF1
Et pour le home je fais un literal pour que monsite.com/ pointe sur monsite.com/index/index
Cf. plus haut pour les modifications
Hors ligne
Ca me semble pas mal
Hors ligne