2012-10-03 16 views
6

Mam problem z opcjonalnym ograniczeniem na trasie, która nie jest opcjonalna w jego elementach podrzędnych. Moja struktura routingu jest następujący:Opcjonalne ograniczenia trasy ZF2 na trasach podrzędnych

'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'] 
      ] 
     ] 
    ] 
] 

które moim zdaniem powinno dać mi następujących trasach:

  1. /profile - Współpracuje
  2. /profile/123 - Współpracuje
  3. /profile/sessions - nie działa
  4. /profile/123/sessions - działa

Gdy używam trasy 3 w widoku URL pomocnika pojawia się następujący błąd:

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

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

pierwotnie miał [0-9]+ jak mój przymusu, lecz czyni to opcjonalne (*) nie wydaje się pomógł. Czy ktoś wcześniej doświadczył tej sprawy?

Odpowiedz

3

Raz miałem ten sam problem, jedynym rozwiązaniem, które znalazłem było stworzenie oddzielnej trasy (w twoim przypadku dla/profilu/sesji) jako opcjonalnego parametru dla trasy bazowej, wydaje się obowiązkowe, gdy uzyskujesz dostęp do trasy podrzędnej .

+2

Skończyło się na tej trasie, ponieważ wolę jasno zdefiniować każdą trasę (nie lubię "magicznych" tras w stylu '/: controller [/: action]'). – Ross

8

Dodaj do swojej trasy macierzystej.

'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', 
     ], 
    ], 
] 

Ta opcja pozwoli mieć id i/lub action. Przynajmniej w teorii powinno to sprawić, aby wszystkie wymienione trasy były możliwe, z tym były some issues.

Powiązane problemy