Zend Framework 2段路由所需的段

And*_*708 4 php routing zend-route zend-framework2 zend-framework-routing

我正在尝试创建一个路径(或两个),让我使用以下URL格式调用两个不同的操作.

mydomain.com/profile
mydomain.com/profile/1234/something
Run Code Online (Sandbox Code Playgroud)

对于第二种格式,1234应该是必需的整数值,而something应该是可选的字符串.通过使用文字路线,第一种格式很简单.我想我可以为第二种格式添加一个段子路由,但我无法让它工作.我试图省略第一种格式,只用分段路线做第二种格式,但我也没有成功.

这是我尝试过的:

'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'
                )
            )
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

因为mydomain.com/profile,我得到以下错误:

Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'No RouteMatch instance provided'
Run Code Online (Sandbox Code Playgroud)

对于mydomain.com/1234/something,我收到以下错误:

Fatal error: Uncaught exception 'Zend\Mvc\Router\Exception\InvalidArgumentException' with message 'Missing parameter "code"'
Run Code Online (Sandbox Code Playgroud)

手册规定如下:

如果段是可选的,则应该用括号括起来.例如,"/:foo [/:bar]"将匹配"/"后跟文本并将其分配给键"foo"; 如果找到任何其他"/"字符,则最后一个字符后面的任何文本将被分配给键"bar".

这不正是我在做什么吗?如果我注释掉约束,上述错误仍然是相同的.

我在这里错过了什么?提前致谢.

Wil*_*ilt 5

我的解决方案:将可选参数的默认值设置为空字符串

我遇到了类似的问题,我通过设置可选参数的默认值(在您的情况下为"username"为空字符串""解决了它;我的解决方案:

'users' => array(
    'type' => 'segment',
    'options' => array(
        'route' => '/users[/:user_id]',
        'constraints' => array(
            'user_id' => '[0-9]*',
        ),
        'defaults' => array(
            'controller' => 'My\Controller\User',
            'user_id' => ""
        )
    ),
Run Code Online (Sandbox Code Playgroud)