1

我正在尝试解决我现在面临的路由问题,但没有运气(谷歌搜索了几个小时,看到了几十个示例并解决了问题,但没有一个对我有用 - 最接近的是URL 中的路由 Zend Framework 2 语言,但即使这是不为我工作)。

我已经创建了一个 SSO 应用程序(我的意思是身份验证部分),现在我将它移植到 ZF2 应用程序(我几乎可以使用它,因为我解决了路由器但现在需要完成最终路由),其中只有这些类型的 URL可能的:

http[s]://domain.com/login/asfgsdgdsfgzsdgdsf/
http[s]://domain.com/login/tdhjsdgbndfnfgdnhd/
http[s]://domain.com/logout/asfgsdgdsfgzsdgdsf/
http[s]: //domain.com/info/dthnzdfbdfhgnfsd/

这些login或部分不是控制器logoutinfo操作,而是我然后从我的IndexControllerindexAction(). URL 的其余部分是客户端应用程序哈希。

现在这是我的路由器配置,它只匹配主路由,当提供其他部分(方法名称 [和哈希])时,我从 ZF2 应用程序中得到 404(所以至少我在应用程序上下文中)。

return array(
    'router' => array(
        'routes' => array(
            'home' => array(
                'type'      => 'Zend\Mvc\Router\Http\Segment',
                'options'   => array(
                    'route'     => '/',
                    'defaults'  => array(
                        'controller'    => 'SSO\Controller\Index',
                        'action'        => 'index',
                        'act'           => 'login', // by doing this I am able to workaround the router and work with SSO
                        'client'        => '<my_secret_hash>', // by doing this I am able to workaround the router and work with SSO
                    ),
                ),
                'child_routes' => array(
                    'action' => array(
                        'type'      => 'Zend\Mvc\Router\Http\Segment',
                        'options'   => array(
                            'route'     => '[/:act]',
                            'defaults'  => array(
                                'act' => 'login',
                            ),
                            'constraints' => array(
                                'act' => '(login|logout|info)?', // only login, logout or info are allowed
                            ),
                        ),
                        'child_routes' => array(
                            'client' => array(
                                'type'      => 'Zend\Mvc\Router\Http\Segment',
                                'options'   => array(
                                    'route'     => '[/:client]',
                                    'constraints' => array(
                                        'client'    => '[a-zA-Z0-9]+',
                                    ),
                                    'defaults'  => array(
                                        'client' => '<my_secret_hash>',
                                ),
                                'may_terminate' => true,
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

(仅提供router了我的module.config的一部分...)

现在只http[s]://domain.com[/]匹配该路由器,并且发生 404 错误中的一个http[s]://domain.com/(login|logout|info)[/]http[s]://domain.com/(login|logout|info)/adfbsDVdfbzdbxfbndzxbxfnb[/]匹配。

尽管我尝试将路由部分定义为可选(仅出于测试和开发目的),但它们应该在生产环境中是必需的。无论如何,我也尝试将它们定义为不是可选的,但也没有用。

问题:我应该如何配置路由器以匹配我在开始时定义的路由(URL)?

4

1 回答 1

3

几件事:

  • 我的猜测是你有太多的斜线 - 一个子路由/不需要在开头用斜线定义,因为它的父已经有了它
  • 我没有看到 2 个嵌套路由的原因(当然我不知道你的配置的其余部分,所以这是一个猜测)
  • home路线可能应该Literal并且能够终止(再次猜测)
  • 有一个不匹配的括号(可能是“错误粘贴”之类的)

我想这应该对你有用:

'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'Literal',
            'may_terminate' => true,
            'options'   => array(
                'route'     => '/',
                'defaults'  => array(
                    'controller'    => 'SSO\Controller\Index',
                    'action'        => 'index',
                ),
            ),
            'child_routes' => array(
                'whateva' => array(
                    'type'      => 'Segment',
                    'may_terminate' => true,
                    'options'   => array(
                        'route'     => '[:act[/:client]]', // as Sam suggested
                        'defaults'  => array(
                            'act' => 'login',
                            'client' => 'fsadfasf32454g43g43543',
                        ),
                        'constraints' => array(
                            'act' => '(login|logout|info)',
                            'client'    => '[a-zA-Z0-9]+',
                        ),
                    ),
                ),
            ),
        ),
    ),
),
于 2013-10-16T17:58:16.547 回答