2012-10-03 11 views
6

子供の中ではオプションではないオプションの制約に問題があります。次のように私のルーティング構造は次のとおりです。子ルートのZF2オプションのルート制約

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

次のルート私を与える必要があります私の心にどの:

  1. /profile - 作品
  2. /profile/123 - 動作しません -
  3. /profile/sessions作品
  4. /profile/123/sessions - 作品

私はURLビューヘルパーでルート3を使用すると、私は次のエラーを取得:

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

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

を私はもともと私の制約として[0-9]+があったが、それはオプションで作る(*)はしていないようです助けてくれました。前にこの事件を経験した人はいますか?

答えて

3

私は同じ問題を一度も抱えていましたが、唯一の解決策は、ベースルートのオプションパラメータとして別のルート(/ profile/sessionsの場合)を作成し、子ルートにアクセスする際に必須となるようです。

+2

私は各ルートを明確に定義するのが好きなので、私はこのルートをとった(私は魔法の '/:controller [/:action]'スタイルルートは嫌いだ)。 – Ross

8

あなたの親ルートに追加してください。

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

これは、オプションのidおよび/またはactionを持つようになります。 少なくとも理論的には、リストされたすべてのルートを可能にする必要があります。some issuesにこれがあります。

関連する問題