2012-10-03 21 views
6

Tengo un problema con una restricción opcional en una ruta que no es opcional en sus hijos. Mi estructura de enrutamiento es el siguiente:ZF2 restricciones de ruta opcionales en rutas secundarias

'profile' => [ 
    'type' => 'segment', 
    'options' => [ 
     'route' => '/profile[/:id]', 
     'constraints' => ['id' => '[0-9]*'], 
     'defaults' => [ 
      'controller' => 'User\Controller\User', 
      'action' => 'profile' 
     ] 
    ], 
    'may_terminate' => true, 
    'child_routes' => [ 
     'sessions' => [ 
      'type' => 'literal', 
      'options' => [ 
       'route' => '/sessions', 
       'defaults' => ['action' => 'sessions'] 
      ] 
     ] 
    ] 
] 

que en mi opinión debería darme las siguientes rutas:

  1. /profile - Funciona
  2. /profile/123 - Funciona
  3. /profile/sessions - no funciona
  4. /profile/123/sessions - works

Cuando uso la ruta 3 en la vista URL ayudante me sale el siguiente error:

$this->url('profile/sessions'); 

Zend\Mvc\Router\Exception\InvalidArgumentException : Missing parameter "id"

Al principio tuve [0-9]+ como mi fuerza, sino por lo que es opcional (*) no parece haber ayudado. ¿Alguien ha experimentado este caso antes?

Respuesta

3

Tuve el mismo problema una vez, la única solución que encontré fue crear una ruta separada (en su caso para/profile/sessions) como el parámetro opcional para la ruta base, parece ser obligatorio al acceder a una ruta hija .

+2

Terminé tomando esta ruta porque prefiero definir claramente cada ruta (no me gustan las rutas de estilo 'mágico' '/: controlador [/: acción]'). – Ross

8

Agrégalo a tu ruta principal.

'profile' => [ 
    'type' => 'segment', 
    'options' => [     // ↓ 
     'route' => '/profile[/:id][/:action]', 
     'constraints' => [ 'id' => '[0-9]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*' ], 
     'defaults' => [ 
      'controller' => 'User\Controller\User', 
      'action' => 'profile', 
     ], 
    ], 
] 

Esto hará que sea opcional para tener id y/o action. Al menos en teoría, debe hacer que todas sus rutas enumeradas sean posibles, ha habido some issues con esto.

Cuestiones relacionadas