Zend Framework 3 - 基于查询字符串的路由
Zend Framework 3 - route based on query string
在 Zend Framework 3 中,是否可以根据 URL 是否包含查询字符串来路由到控制器?
比如我有这两个URL:
/users
/users?name=Bob
我希望第一条路线调用 UsersController
,第二条路线调用 NameController
。
这可能吗?
我的评论正在变成答案。所以,给你。
下次请务必遵守How to Ask.
请阅读 ZF3 docs on Router and possibly RFC 3986 Chapter 3 - Syntax Components,其中显示了什么是路径,什么是查询。
来自RFC 3986 Chapter 3 - Syntax Components
The following are two example URIs and their component parts:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose
ZF3路由配置一般是路径上的配置。 (几乎每个通用框架也是如此。) 是的,变量可以是路径的一部分。因此,它们是在路由配置中配置的。框架路由的高级配置通常还允许在方案和权限中 changes/requirements。
不属于路由配置的是 'query' 和 'fragment' 部分。
如果你想做某事,例如捕获一个“名称”key/value 对并相应地进行路由,您将必须在路径上创建一个“捕获器”(或任何名称)并自行确定重定向。
例如,您可以做类似 . If your controller instance extends the default Zend Framework AbstractActionController
class, then you should have the forward
plugin 可用的事情。来自文档:
Forward returns the results of dispatching the requested controller;
it is up to the developer to determine what, if anything, to do with
those results. One recommendation is to aggregate them in any return
value from the invoking controller.
As an example:
$foo = $this->forward()->dispatch('foo', ['action' => 'process']);
return [
'somekey' => $somevalue,
'foo' => $foo,
];
当然,你可以马上return它。
另一种选择是redirect
plugin(同link)。
return $this->redirect()->toRoute('login-success');
有了这一切,你可以做如下事情:
$name = $this->params()->fromQuery('name', null);
if ($name) {
// dispatch
if ($dispatchResult) {
// return special
}
}
// redirect
重定向到路由名称的位置(即配置的路径)
作为 rkeet ,查询字符串不是路由的一部分。因此,我们简单地在路由配置数组中添加了一个三元组:
'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 和 forward/redirect)。
我会配置路由路径以便有两条不同的路由:
'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)
在 Zend Framework 3 中,是否可以根据 URL 是否包含查询字符串来路由到控制器?
比如我有这两个URL:
/users
/users?name=Bob
我希望第一条路线调用 UsersController
,第二条路线调用 NameController
。
这可能吗?
我的评论正在变成答案。所以,给你。
下次请务必遵守How to Ask.
请阅读 ZF3 docs on Router and possibly RFC 3986 Chapter 3 - Syntax Components,其中显示了什么是路径,什么是查询。
来自RFC 3986 Chapter 3 - Syntax Components
The following are two example URIs and their component parts:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
ZF3路由配置一般是路径上的配置。 (几乎每个通用框架也是如此。) 是的,变量可以是路径的一部分。因此,它们是在路由配置中配置的。框架路由的高级配置通常还允许在方案和权限中 changes/requirements。
不属于路由配置的是 'query' 和 'fragment' 部分。
如果你想做某事,例如捕获一个“名称”key/value 对并相应地进行路由,您将必须在路径上创建一个“捕获器”(或任何名称)并自行确定重定向。
例如,您可以做类似 AbstractActionController
class, then you should have the forward
plugin 可用的事情。来自文档:
Forward returns the results of dispatching the requested controller; it is up to the developer to determine what, if anything, to do with those results. One recommendation is to aggregate them in any return value from the invoking controller.
As an example:
$foo = $this->forward()->dispatch('foo', ['action' => 'process']);
return [
'somekey' => $somevalue,
'foo' => $foo,
];
当然,你可以马上return它。
另一种选择是redirect
plugin(同link)。
return $this->redirect()->toRoute('login-success');
有了这一切,你可以做如下事情:
$name = $this->params()->fromQuery('name', null);
if ($name) {
// dispatch
if ($dispatchResult) {
// return special
}
}
// redirect
重定向到路由名称的位置(即配置的路径)
作为 rkeet
'users' => [
'type' => Literal::class,
'options' => [
'route' => '/users',
'defaults' => [
'controller' => isset($_GET['name'])
? NameController::class
: UsersController::class,
'action' => 'index',
],
],
'may_terminate' => true,
],
这是不言自明的,但基本上调度的控制器取决于是否在查询字符串中设置了值。
我们决定不使用 forward()
插件,因为我们不想多余地实例化一个额外的控制器。
即使 rkeet 的
我会配置路由路径以便有两条不同的路由:
'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)