Zend 2:路径约束记录特定错误

时间:2017-03-15 13:25:11

标签: php zend-framework zend-framework2

我尝试记录用户是否为

的路由输入了错误的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

1 个答案:

答案 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进行此类验证响应。

注意:这不是一个完整的示例,需要更多的工作!