在Zend Framework 3中,是否可以根据URL是否包含查询字符串来路由到控制器?例如,我有这两个URL:
/users /users?name=Bob
字符串我希望第一个路由调用UsersController,第二个路由调用NameController。这可能吗?
UsersController
NameController
2ledvvac1#
阅读ZF3 docs on Router和可能的RFC 3986第3章-查询组件,其中显示了什么是路径和什么是查询。来自RFC 3986第3章-网络组件以下是两个URI示例及其组成部分:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
字符串ZF 3路由配置通常是在路径上进行配置。(几乎每个通用框架都是如此。) 是的,变量可以是路径的一部分。因此,它们在路由配置中进行配置。框架路由的高级配置通常还允许方案和权限的更改/要求。“查询”和“片段”部分不是路由配置的一部分。如果你想做一些事情,例如捕获一个“name”键/值对并相应地进行路由,你将不得不在路径上创建一个“catcher”(或者任何名称)并自己确定重定向。例如,你可以做类似this answer的事情。如果你的控制器示例扩展了默认的Zend Framework AbstractActionController类,那么你应该有可用的forward插件。从文档中:Forward返回调度请求的控制器的结果;由开发人员决定如何处理这些结果。一个建议是将它们聚集在调用控制器的任何返回值中。例如:
AbstractActionController
forward
$foo = $this->forward()->dispatch('foo', ['action' => 'process']); return [ 'somekey' => $somevalue, 'foo' => $foo, ];
型当然,你可以立即归还。另一个选项是redirect插件(相同的链接)。
redirect
return $this->redirect()->toRoute('login-success');
型有了这些,你可以做一些类似的事情:
$name = $this->params()->fromQuery('name', null); if ($name) { // dispatch if ($dispatchResult) { // return special } } // redirect
型重定向到路由名称(即配置的路径)
cnh2zyt32#
由于rkeet mentioned,查询字符串不是路由的一部分。因此,我们简单地在路由配置数组中添加了一个三进制:
'users' => [ 'type' => Literal::class, 'options' => [ 'route' => '/users', 'defaults' => [ 'controller' => isset($_GET['name']) ? NameController::class : UsersController::class, 'action' => 'index', ], ], 'may_terminate' => true, ],
字符串这是不言自明的,但基本上调度的控制器取决于是否在查询字符串中设置了一个值。我们决定不使用forward()插件,因为我们不想多余地示例化一个额外的控制器。
forward()
xeufq47z3#
即使rkeet的answer在技术上是正确的,我也会避免这种解决方案,因为它将单个HTTP请求转换为两个(初始GET和转发/重定向)。我会配置路由路径,以便有两个不同的路由:
'router' => [ 'routes' => [ 'users' => [ 'type' => Literal::class, 'options' => [ 'route' => '/users', 'defaults' => [ 'controller' => UsersController::class, 'action' => 'index' ], 'may_terminate' => true, 'child_routes' => [ 'name' => [ // This is the subroute name 'type' => Segment::class, 'options' => [ 'route' => '/:name', // Option 1 // 'route' => '/name/:name', // Option 2 'defaults' => [ 'controller' => NameController::class, 'action' => 'index' ], 'constraints' => [ 'name' => '[a-zA-Z]+', ] ] ] ] ] ] ] ]
字符串通过此配置,您可以访问以下URL
/users /users/Bob (option 1) /users/name/Bob (option 2)
型
3条答案
按热度按时间2ledvvac1#
阅读ZF3 docs on Router和可能的RFC 3986第3章-查询组件,其中显示了什么是路径和什么是查询。
来自RFC 3986第3章-网络组件
以下是两个URI示例及其组成部分:
字符串
ZF 3路由配置通常是在路径上进行配置。(几乎每个通用框架都是如此。) 是的,变量可以是路径的一部分。因此,它们在路由配置中进行配置。框架路由的高级配置通常还允许方案和权限的更改/要求。
“查询”和“片段”部分不是路由配置的一部分。
如果你想做一些事情,例如捕获一个“name”键/值对并相应地进行路由,你将不得不在路径上创建一个“catcher”(或者任何名称)并自己确定重定向。
例如,你可以做类似this answer的事情。如果你的控制器示例扩展了默认的Zend Framework
AbstractActionController
类,那么你应该有可用的forward
插件。从文档中:Forward返回调度请求的控制器的结果;由开发人员决定如何处理这些结果。一个建议是将它们聚集在调用控制器的任何返回值中。
例如:
型
当然,你可以立即归还。
另一个选项是
redirect
插件(相同的链接)。型
有了这些,你可以做一些类似的事情:
型
重定向到路由名称(即配置的路径)
cnh2zyt32#
由于rkeet mentioned,查询字符串不是路由的一部分。因此,我们简单地在路由配置数组中添加了一个三进制:
字符串
这是不言自明的,但基本上调度的控制器取决于是否在查询字符串中设置了一个值。
我们决定不使用
forward()
插件,因为我们不想多余地示例化一个额外的控制器。xeufq47z3#
即使rkeet的answer在技术上是正确的,我也会避免这种解决方案,因为它将单个HTTP请求转换为两个(初始GET和转发/重定向)。
我会配置路由路径,以便有两个不同的路由:
字符串
通过此配置,您可以访问以下URL
型