Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 zf2路由器:一个模块使路由器无法找到另一个模块。我怎样才能使两者都起作用?_Zend Framework2_Zend Framework Routing - Fatal编程技术网

Zend framework2 zf2路由器:一个模块使路由器无法找到另一个模块。我怎样才能使两者都起作用?

Zend framework2 zf2路由器:一个模块使路由器无法找到另一个模块。我怎样才能使两者都起作用?,zend-framework2,zend-framework-routing,Zend Framework2,Zend Framework Routing,我们刚刚开始使用zf2,所以其他人制作了一个缩略图服务器模块,然后我添加了一个查找服务器模块。我之所以称这些服务器是因为它们都是RESTful API。起初,它们似乎协同工作,但有人对我的模块做了一些更改,现在缩略图服务器将无法工作,除非从模块的application.config.php列表中删除查找。不管怎样,查找服务器都可以工作。查看代码,我看不出对查找所做的更改会如何影响缩略图。我得到的错误如下所示: 发生404错误 找不到页面。 请求的控制器无法分派请求 控制器: 查找\控制器\查找

我们刚刚开始使用zf2,所以其他人制作了一个缩略图服务器模块,然后我添加了一个查找服务器模块。我之所以称这些服务器是因为它们都是RESTful API。起初,它们似乎协同工作,但有人对我的模块做了一些更改,现在缩略图服务器将无法工作,除非从模块的
application.config.php
列表中删除查找。不管怎样,查找服务器都可以工作。查看代码,我看不出对查找所做的更改会如何影响缩略图。我得到的错误如下所示:

发生404错误
找不到页面。
请求的控制器无法分派请求

控制器: 查找\控制器\查找
下面是
application.config.php
的外观:


请求可以由多个路由匹配。例如:url/foo可以由文本路由
/foo
和路由
[/:action]
匹配。要区分这两条路由,配置它们的顺序很重要

发生的情况是,路由按后进先出顺序匹配,因此最后一条路由必须是最明确的。在“/foo”示例中,此配置将匹配文本:

'router' => array(
    'routes' => array(
        'test1' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '[/:action]',
                'defaults' => array(
                    //
                ),
            ),
        ),
        'test2' => array(
            'type'    => 'literal',
            'options' => array(
                'route'    => '/foo',
                'defaults' => array(
                    //
                ),
            ),
        ),
    ),
),
'router' => array(
    'routes' => array(
        'view' => array(
            'type'    => 'segemnt',
            'options' => array(
                'route'    => '/view[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'view',
                    //
                ),
            ),
        ),
        'create' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/create[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'create',
                    //
                ),
            ),
        ),
        'update' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/update[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'update',
                    //
                ),
            ),
        ),
        // And so on
    ),
),
但是,在下面的配置中,文字将永远不会匹配,因为
[/:action]
可能与
/foo
匹配

'router' => array(
    'routes' => array(
        'test2' => array(
            'type'    => 'literal',
            'options' => array(
                'route'    => '/foo',
                'defaults' => array(
                    //
                ),
            ),
        ),
        'test1' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '[/:action]',
                'defaults' => array(
                    //
                ),
            ),
        ),
    ),
),
现在看一下您的两个模块。第一个(缩略图)有一个路由
/缩略图[/:action][/:output]
。它以文本部分开始。然后,您的第二个模块(查找)有一个路由
[/:action][/:version][/:resource][/:code][/:resource\u xref]

现在,如果回到后进先出顺序,任何以
/thumbnail
开头的路由都将在查找路由中匹配

解决方案

有两种选择。首先是交换模块的顺序。如果模块之间存在相互依赖的关系,则这始终是一个重要的顺序。首先加载查找,然后加载Thumnnail,这样缩略图路由将稍后放入配置中。因此,它首先匹配。因此,你的应用程序再次工作

然后是第二个解决方案(imho越好)。在查找中,您有一个“一条路线来管理所有人”,这并不是一个很好的实践。你可能会像现在一样陷入困境,不知道出了什么问题。因此,在路线中尽可能多地指定。将查找的第一部分也设置为文字(是否
/Lookup[/:action][/:version][/:resource][/:code][/:resource\u xref]
不是选项?)。或删除作为参数的操作,并使其成为文字:

'router' => array(
    'routes' => array(
        'test1' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '[/:action]',
                'defaults' => array(
                    //
                ),
            ),
        ),
        'test2' => array(
            'type'    => 'literal',
            'options' => array(
                'route'    => '/foo',
                'defaults' => array(
                    //
                ),
            ),
        ),
    ),
),
'router' => array(
    'routes' => array(
        'view' => array(
            'type'    => 'segemnt',
            'options' => array(
                'route'    => '/view[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'view',
                    //
                ),
            ),
        ),
        'create' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/create[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'create',
                    //
                ),
            ),
        ),
        'update' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/update[/:version][/:resource][/:code][/:resource_xref]',
                'defaults' => array(
                    'action' => 'update',
                    //
                ),
            ),
        ),
        // And so on
    ),
),

这样,您的查找模块有一个固定的起点,并且仅当这些第一部分在请求uri中时才匹配。然后,您的
/thumbnail[/:action][/:output]
与查找路由完全解耦。

我看到的唯一奇怪的事情是查找模块中定义的路由:“route'=>”[/:action][/:version][/:resource][/:code][/:resource\u xref]”这基本上意味着所有请求都将转到查找模块。鲁本绝对正确。考虑将每一个巨型路线分解成每个行动的个别路线。或者,您可以尝试约束操作,使其仅匹配一组特定的操作名称。就是这样,谢谢!感谢您的深入解释。它以前是有效的,因为我在那里有/lookup,但另一个开发人员在进行更改时删除了它。我们都是zf2新手,所以我们都不太了解路由器的工作原理。现在它有了一个唯一的标识符,所以我们可以得到缩略图和查找,并且可以根据需要进行扩展。