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