Php Zend Framework 3-基于查询字符串的路由
在Zend Framework 3中,是否可以根据URL是否包含查询字符串路由到控制器 例如,我有以下两个URL: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
/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 FrameworkAbstractActionController
类,那么您应该拥有可用的。从文档中:
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中的?
之后)。您的回答显示了基本路线配置设置,如我已经链接的中所述。