2017-03-15 1 views
0
내가 같은 특정 오류받을 수

젠드 2 : 경로 제약이 특정 오류를 기록

'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); 
} 

과 경로에 대한 사용자 유형 잘못된 URL 매개 변수 경우 로그인을 시도

: Value for Parameter "id" must type integer를?

답변

0

그렇게 쉽지는 않을 것입니다. 경로가 일치하지 않는 이유에 대한 정확한 세부 정보를 찾으려면 자체 기능을 구축해야합니다.

해당 클래스의 방법을 사용하여 경로 일치를 확인합니다. 예를 들어 세그먼트 경로의 경우이 방법은 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'); 
     } 
    } 
} 

상황이 당신이 리스너 클래스로 모든 이동 (대신 당신의 module.php 파일을 오염) 고려할 수 예쁘게 만들려면 당신은 또한 여기에 404 코드를 고려할 수 있습니다. 그럴 가능성이 가장 높은 곳은 is a more suitable status code입니다.

참고 : 이것은 완전히 완료된 예는 아니며 더 많은 작업이 필요합니다!

+0

멋진 idear이지만 $ event-> getController()); null – stefen

+0

@stefen, 이해할 수 있고, 지금은 확인할 수 없습니다. 나는 나중에 이것으로 돌아온다 ... – Wilt

+0

고마워 :) 이것은 지원되지 않는다면 수입이 아니지만 ZF2에 또 다른 문제가있다. 나를 도울 수있다 : http://stackoverflow.com/questions/42859322/ zend-2-sqlsrv-prepareparams-not-setted – stefen