Zend Framework 3-基于查询字符串的路由

Leo*_*los 4 php routes zend-framework3

在Zend Framework 3中,是否可以根据URL是否包含查询字符串来路由到控制器?

例如,我有以下两个URL:

/users
/users?name=Bob
Run Code Online (Sandbox Code Playgroud)

我想第一条路线叫a UsersController和第二条路线叫a NameController

这可能吗?

rke*_*eet 7

我的评论变成了答案。所以,你去。

下次,请确保遵循“ 如何提问”


请阅读路由器上的ZF3文档,以及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
Run Code Online (Sandbox Code Playgroud)

ZF3路由配置通常是路径上的配置。(几乎每个通用框架都是这样。)是的,变量可以是路径的一部分。因此,它们是在路由配置中配置的。框架路由的高级配置通常还允许对方案和权限进行更改/要求。

不是路由配置的一部分是“查询”和“片段”部分。

如果您想做某事,例如捕获“名称”键/值对并进行相应的路由,则必须在路径上创建“捕捉器”(或该名称的任何名称)并确定重定向自己。

例如,您可以做这样的回答。如果您的控制器实例扩展了默认的Zend Framework AbstractActionController类,那么您应该有可用的forward插件。从文档:

转发返回调度请求的控制器的结果;由开发人员决定如何处理这些结果。一种建议是将它们汇总为调用控制器的任何返回值。

举个例子:

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose
Run Code Online (Sandbox Code Playgroud)

当然,您可以立即将其退回。

另一个选择是redirect插件(相同的链接)。

 $foo = $this->forward()->dispatch('foo', ['action' => 'process']);
 return [
     'somekey' => $somevalue,
     'foo'     => $foo,
 ];
Run Code Online (Sandbox Code Playgroud)

有了这些,您可以执行以下操作:

return $this->redirect()->toRoute('login-success');
Run Code Online (Sandbox Code Playgroud)

您重定向到路由名称(即配置的路径)的位置