我尝试记录用户是否为
的路由输入了错误的url参数 'constraints' => array('personalnumber' => '[0-9]*')
$error = $e->getError();
if ($error == Application::ERROR_ROUTER_NO_MATCH) {
$url = $e->getRequest()->getUriString();
$sm->get('Zend\Log\RouteLogger')->warn('Url could not match to routing: ' . $url);
}
我是否可以收到类似的错误:Value for Parameter "id" must type integer
?
答案 0 :(得分:0)
那不会那么容易。您必须构建自己的功能,以找出路线不匹配的确切详细信息。
使用相应类中的RouteInterface::match
方法检查路由匹配。例如,对于细分市场路线,可以找到此方法in the Zend\Router\Http\Segment
class on line 359-404。
如果没有匹配,则该类返回null / void。路由不匹配的原因的详细信息不是响应的一部分,因此您必须自己进行深度分析并编写自己的自定义错误响应。
这样的解决方案可能是在触发调度错误事件时手动验证人员编号(例如通过将其与请求URL隔离)并在默认404响应之前返回您自己的自定义响应。
<?php
namespace Application;
use Zend\Http\Response;
use Zend\Mvc\MvcEvent;
use Zend\Router\Http\RouteMatch;
class Module{
public function onBootstrap(MvcEvent $event)
{
$eventManager = $event->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'validatePersonNumber'), 1000);
}
public function validatePersonNumber(MvcEvent $event)
{
if ($event->getError() !== Application::ERROR_ROUTER_NO_MATCH) {
// Not a 404 error
return;
}
$request = $event->getRequest();
$controller = $event->getController();
if($controller !== 'Application\Expected\ControllerName'){
// not a controller for person number route
return;
}
$url = $request->getRequestUri();
$personNumber = ''; //...manually isolate the person number from the request...
/** @var Response $response */
$response = $event->getResponse();
$response->setStatusCode(404);
$viewModel = $event->getViewModel();
$viewModel->setTemplate('error/404');
$event->setViewModel($viewModel);
$event->stopPropagation(true);
if (strlen($personNumber) !== 12) {
$viewModel->setVariable('message', 'A person number should have 12 characters');
}
if(...additional check...){
$viewModel->setVariable('message', 'Some other message');
}
}
}
为了让事情变得更漂亮,您可以考虑将所有这些转移到Listener类中(而不是污染您的module.php
文件),您也可以在此处考虑404
代码。最有可能is a more suitable status code进行此类验证响应。
注意:这不是一个完整的示例,需要更多的工作!