Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
il y a une chose dan le routage ZF2 que je ne suis pas sur de comprendre, prenons mon cas:
'router' => array( 'routes' => array( 'hostbill-api' => array( 'type' => 'Literal', 'options' => array( 'route' => '/api/hostbill', 'constraints' => array( 'service' => '[a-zA-Z][a-zA-Z0-9_-]*', 'call' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( '__NAMESPACE__' => 'Hostbill\Controller', 'controller' => 'Api', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'hostbill-api-service' => array( 'type' => 'Segment', 'options' => array( 'route' => '[/:service[/:call]]', 'constraints' => array( 'service' => '[a-zA-Z][a-zA-Z0-9_-]*', 'call' => '[a-zA-Z][a-zA-Z0-9_-]*', ), ), ), 'hostbill-api-hook' => array( 'type' => 'Segment', 'options' => array( 'route' => '/hook[/:action]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( '__NAMESPACE__' => 'Hostbill\Controller', 'controller' => 'Hook', 'action' => 'index', ), ), ), ), ), ), ),
les 2 premières routes marchent parfaitement, mais la 3eme me retourne une 404 dans les cas suivants:
http://host/api/hostbill/hook/xxx -> pas de fonction xxxAction() dans le controlleur -> 404
http://host/api/hostbill/hook/yyy -> fonction yyyAction() présente dans le controlleur -> OK
j'aimerais, si possible, appeler la bonne méthode action, sauf si elle n'est pas présente, dans ce cas là appeler le défault (indexAction), est ce possible ?
Hors ligne
Salut, depuis une route je vois pas trop comment tu peux le gérer. Tu peux le faire via un listener qui écoute l'évènement dispatch error (il me semble que c'est celui là qui renvoi vers la 404) et dans le cas où ça correspond à ton besoin tu rediriges vers le bon contrôleur et la bonne action.
Hors ligne
donc le default ne sert pas à gérer une route non trouvée ? (j'ai pas trop compris l'intérêt du default en fait)
Hors ligne
Non le default permet de renseigner les paramètres par défaut dans le cas où ils sont non renseignés. Personnellement je fais très peu de route segment (c'est les plus gourmande), je m'en sers uniquement lorsque j'ai un id ou un paramètre à passer dans l'url du coup [:action] n'est jamais présent dans mes url et le default permet de spécifier l'action .
Hors ligne
D'accord,
et dans mon cas tu ferais comment du coup ?
la première child route doit rester telle quelle, elle redirige vers une autre url selon les paramètres
la deuxième doit matcher l'action avec le controlleur, et si l'action n'est pas trouvée, rediriger vers l'index
Hors ligne
pour être un peu plus clair sur ce que je veux faire:
/api/hostbill -> route de base
/api/hostbill/:service -> liste des :call du service (/api/hostbill/client)
/api/hostbill/:service/:call -> resultat du :call (/api/hostbill/client/getClients)
/api/hostbill/hook -> index des hooks, retourne une liste des disponibles
/api/hostbill/hook/:hook -> appel du hook :hook
le souci c'est que si je vais ces 2 routes, quand j'appelle le /hook/:hook, l'autre route prend le relais car pour lui /hook/:hook c'est la même chose que /:service/:call
j'espère être plus clair
Hors ligne
Alors à toi de ne pas rendre dynamique la route /:service en écrivant en dur l'url. Ca te fait faire beaucoup plus de routes mais sinon je ne vois pas.
Hors ligne
ou alors je dois ajouter un niveau à cette route en mettant, par exemple, /service/:service
Hors ligne
Oui tu peux aussi.
Hors ligne