My Zend Framework 3 应用程序管理订单:
- 每个用户都可以下订单。
- 每个用户都可以看到任何订单。
- 每个用户都可以编辑他的订单,如果他是这个订单的创建者。否则,他将获得
403
的状态代码并被重定向到相应的页面。
在MyModuleModule#onRoute(...)
中实现如下:
public function onRoute(EventInterface $event)
{
if ($event->getRequest() instanceof HttpRequest) {
...
if (! $acl->isAllowed($role, $controller, $action)) {
/** @var Response $response */
$response = $event->getResponse();
$config = $serviceManager->get('config');
$redirectRoute = ! empty($config['acl']['redirect_route']) ? $config['acl']['redirect_route'] : null;
if (! empty($redirectRoute)) {
$url = $event->getRouter()->assemble($redirectRoute['params'], $redirectRoute['options']);
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(Response::STATUS_CODE_403);
$response->sendHeaders();
exit(); // <-- this makes the code untestable
} else {
...
}
}
} elseif ($event->getRequest() instanceof ConsoleRequest) {
...
}
}
它正在工作。 但是现在,我正在编写集成测试,这个exit()
调用打破了它们。
在这个地方的exit()
替代方案以及Module
类中适当/干净的重定向方式是什么?
它适用于状态代码302
(而不是403
(:
$response->setStatusCode(Response::STATUS_CODE_302);
Http Resopnse代码"403"不是重定向代码,它只是针对客户端错误。
以下代码可用于重定向-
// REDIRECTION CODES
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => 'Switch Proxy', // Deprecated
307 => 'Temporary Redirect',
现在按点
- 每个用户都可以编辑他的订单,如果他是这个订单的创建者。否则,他将获得状态代码 403 并被重定向到相应的页面。
您应该处理它,只需重定向到403"禁止"页面(该页面可能有您的消息(