Zend Framework 2, segment de route nécessaire segment
Je suis en train de faire un itinéraire (ou deux) qui me permettra d'invoquer deux actions différentes avec l'URL ci-dessous les formats.
mydomain.com/profile
mydomain.com/profile/1234/something
Pour la deuxième format, le 1234
doit être un entier obligatoire de la valeur, tandis que something
devrait être une chaîne facultative. Le premier format est simple, à l'aide d'un littéral de l'itinéraire. J'ai pensé que je pourrais ajouter un segment enfant de route pour la deuxième format, mais je ne peux pas le faire fonctionner. J'ai essayé de laisser le premier format et seulement le deuxième avec un segment de route, mais je n'ai pas réussi à que ce soit.
Voici ce que j'ai essayé:
'profile' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/profile',
'defaults' => array(
'controller' => 'User\Controller\User',
'action' => 'profile'
)
),
'child_routes' => array(
'profile_view' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
'options' => array(
'route' => '/:code[/:username]',
'constraints' => array(
'code' => '[0-9]*',
'username' => '[a-zA-Z0-9_-]*'
),
'defaults' => array(
'controller' => 'User\Controller\User',
'action' => 'view_profile'
)
)
)
)
)
Pour mydomain.com/profile
, j'obtiens l'erreur suivant:
Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'No RouteMatch instance provided'
Pour mydomain.com/1234/something
, j'obtiens l'erreur suivante:
Fatal error: Uncaught exception 'Zend\Mvc\Router\Exception\InvalidArgumentException' with message 'Missing parameter "code"'
La manuel indique ce qui suit:
Si un segment est facultatif, il doit être entouré par des crochets. Comme un
exemple, “/:foo [/bar]” pourrait correspondre à un “/” suivi par le texte et l'affecter
à la clé, “foo”; si d'autres caractères “/” sont trouvés, tout
le texte qui suit le dernier sera affecté à la touche “barre”.
N'est-ce pas exactement ce que je fais? Les erreurs ci-dessus restent les mêmes si j'en commentaire les contraintes.
Ce qui me manque ici? Merci à l'avance.
OriginalL'auteur Andy0708 | 2013-02-23
Vous devez vous connecter pour publier un commentaire.
Ma solution: Définir la valeur par défaut pour votre paramètre facultatif à la chaîne vide
J'ai rencontré un problème similaire, je l'ai résolu en définissant la valeur par défaut pour le paramètre facultatif (dans votre cas, "nom d'utilisateur" à une chaîne vide ( "" ; Ma solution:
OriginalL'auteur Wilt
J'ai joué un peu avec elle un peu plus. Après le débogage, je ne pouvais toujours pas le comprendre. J'ai essayé d'ajouter une valeur par défaut à la
code
paramètre et qui semblait faire l'affaire. Pourquoi sur la Terre qui fonctionne et comment il est logique, je n'ai aucune idée. Pour moi, il ne compte pas si j'ai une valeur par défaut spécifiée ou pas si j'ai donné une valeur dans l'URL le paramètre dans l'URL. Néanmoins, apparemment, il n'importe - ou, au moins, dans ce cas, il n'.Voici le code de travail. J'ai aussi mis à jour l'expression régulière pour le paramètre de code.
Il est intéressant de noter, je peux obtenir les
code
paramètre très bien dans mon contrôleur, et il n'est pas 0 (valeur par défaut). Plutôt, c'est la valeur que j'écris dans l'URL, ce qui est ce que je voulais de toute façon.Ce ne doit pas être marqué comme réponse; c'est seulement à l'aide de bande. J'ai posté ce que je pense est la réponse ci-dessous. Veuillez regarder.
OriginalL'auteur Andy0708
La deuxième exception vous obtenez
Missing parameter "code"
vient de montage, pas de correspondance. Cela signifie que vous n'avez pas à fournir le code lors de l'assemblage de la routeprofile/profile_view
.Par le chemin, vous n'avez pas de préfixe de votre child_routes avec le parent des itinéraires de nom. Il suffit d'appeler l'enfant en route "vue", et l'assembler comme
profile/view
.OriginalL'auteur DASPRiD
Je crois que vous êtes absent de la
may_terminate
option, comme suit:mydomain.com/profile
fonctionne, maismydomain.com/profile/
,mydomain.com/profile/1234
etmydomain.com/1234/something
tous me donner le message d'erreur indiquant que lecode
paramètre est manquant.Il n'y a pas de route qui devrait satisfaire
mydomain.com/profile/
comme le slash vous met dans l'enfant de l'itinéraire et:code
devient nécessaire. Cette voie de travail si les contraintes sont supprimées de:code
? Sinon je serais à la recherche pour désactiver:username
et simplement obtenir l'itinéraire de travail avec/profile/1234
et/profile
.Oui, je ne m'attendais pas
mydomain.com/profile/
à travailler, mais je me demandais pourquoi il même appariés avec l'enfant de la route quand un paramètre obligatoire n'a pas été fourni. De toute façon, en supprimant les contraintes de ne pas faire une différence. Le fait d'enlever complètement le nom d'utilisateur de la route ne fait pas de différence. Je reçois toujours le même message d'erreur. J'ai vérifié tous mes autres voies, et aucun d'eux ne devrait interférer avec mon nouvel itinéraire. J'ai essayé de désactiver certains, mais avec les mêmes résultats. Il est correspondant à la bonne route, de toute façon, donc ce n'est pas le problème. Merci pour l'aide pour l'instant.Il peut-être la peine de plonger dans le segment de code de la route et vérifier les valeurs et l'état de l'instance, avant que l'exception est levée.
OriginalL'auteur DrBeza
Deux raisons pour lesquelles cela se produit selon Bittarman. La principale raison, dit-il, est:
Je n'avais plus le moindre de la raison, apparemment:
J'ai été en utilisant $this->url() dans ma mise en page. Parce qu'il n'y a pas de voie de correspondance--une erreur 404--il souffle sur toutes les erreurs 404.
OriginalL'auteur Bluebaron