6

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

'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:パラメータ「id」がありません

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

4

2 に答える 2

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。少なくとも理論的には、リストされているすべてのルートが可能になるはずですが、これにはいくつかの問題があります。

于 2012-10-05T07:51:50.670 に答える
3

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

于 2012-10-03T18:00:31.597 に答える