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

Php Zend Framework 3-基于查询字符串的路由,php,routes,zend-framework3,Php,Routes,Zend Framework3,在Zend Framework 3中,是否可以根据URL是否包含查询字符串路由到控制器 例如,我有以下两个URL: /users /users?name=Bob 我希望第一个路由调用userscoontroller,第二个路由调用NameController 这可能吗?我的评论变成了答案。好了,给你 下一次,请务必遵循以下步骤 请阅读和,可能会显示什么是路径,什么是查询 从 以下是两个示例URI及其组件: foo://example.com:8042/over/there?name

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

例如,我有以下两个URL:

/users
/users?name=Bob
我希望第一个路由调用
userscoontroller
,第二个路由调用
NameController


这可能吗?

我的评论变成了答案。好了,给你

下一次,请务必遵循以下步骤


请阅读和,可能会显示什么是路径,什么是查询

以下是两个示例URI及其组件:

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose
ZF3路由配置通常是路径上的配置。(几乎所有常见的框架都是如此。)是的,变量可以是路径的一部分。因此,它们是在路由配置中配置的。框架路由的高级配置通常还允许方案和权限中的更改/需求

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

如果要执行某些操作,例如捕获“名称”键/值对并相应地进行路由,则必须在路径上创建一个“捕获器”(或任何名称),并自行确定重定向

例如,您可以执行以下操作。如果您的控制器实例扩展了默认的Zend Framework
AbstractActionController
类,那么您应该拥有可用的。从文档中:

Forward返回调度请求控制器的结果; 如果有的话,开发人员可以决定如何处理 这些结果。一个建议是在任何回报中汇总它们 来自调用控制器的值

例如:

$foo=$this->forward();
返回[
“somekey”=>$somevalue,
“foo”=>$foo,
];
当然,你可以立即归还

另一个选项是(相同的链接)

return$this->redirect()->toRoute('login-success');
有了这些,您可以执行以下操作:

$name=$this->params()->fromQuery('name',null);
如果($name){
//派遣
如果($dispatchResult){
//退货特价
}
} 
//重定向
当您将路由名称(即配置路径)重定向为rkeet时,查询字符串不是路由的一部分。因此,我们只是在route config数组中添加了一个三值:

'users' => [ 
    'type'    => Literal::class,
    'options' => [ 
        'route'    => '/users',
        'defaults' => [
            'controller' => isset($_GET['name'])
                          ? NameController::class
                          : UsersController::class,
            'action'     => 'index',
        ],   
    ],   
    'may_terminate' => true,
],
这是不言自明的,但基本上调度的控制器取决于是否在查询字符串中设置了值

我们决定不使用
forward()
插件,因为我们不想多余地实例化一个额外的控制器。

即使rkeet在技术上是正确的,我也会避免使用该解决方案,因为它将一个HTTP请求转换为两个(初始GET和转发/重定向)

我将配置路由路径,以便有两个不同的路由:

“路由器”=>[
“路线”=>[
“用户”=>[
'type'=>Literal::class,
“选项”=>[
“路由”=>“/用户”,
“默认设置”=>[
“控制器”=>UsersController::类,
'操作'=>'索引'
],
“may_terminate”=>true,
“子路由”=>[
'name'=>[//这是子例程名称
'type'=>段::类,
“选项”=>[
'路由'=>'/:名称',//选项1
//“路由”=>“/name/:name',//选项2
“默认设置”=>[
“控制器”=>NameController::类,
'操作'=>'索引'
],
'约束'=>[
“名称”=>“[a-zA-Z]+”,
]
]
]
]
]
]
]
]
通过此配置,您可以访问以下URL的

/users
/users/Bob (option 1)
/users/name/Bob (option 2)

感谢您提供有关
forward()
redirect()
插件的信息。虽然这可以工作,但它打破了单一路由上单一操作的模式。在ZF中明确执行的操作。我会严肃地建议你不要这样做,因为它创造了一些魔力,你今天就知道了,但一年后会让人头疼。再说一次,这是可行的……我们最初实际上使用了这个路由结构。但是,
:name
参数通常包含不适合URL的字符,例如斜杠。因此,
:name
参数必须是一个查询参数,而不是一段路由。问题不是关于“路径”部分的路由配置(如我的回答所示),而是在查询部分(在完整URL中的
之后)。您的回答显示了基本路线配置设置,如我已经链接的中所述。