2015-04-29 1 views
2

Я использую последнюю версию Phalcon и я нахожу, что трудно найти информацию о том, как сделать действие не выполнится, когда требуемые параметры отсутствуют, как показано нижеPhalcon параметр URL отсутствует, но действие еще запускается на выполнение

class TestController extends ControllerBase{ 

public function detailsAction($id) { 
     $this->view->SetVar('theid',$id); 
    } 
} 

когда я получить доступ к этому, как показано ниже

http://localhost/phalcon/test/details 

мнение по-прежнему запускается на выполнение, но идентификатор отсутствует, и когда я к нему доступ через

http://localhost/phalcon/test/details/5 

Получаю значение 5.

Может кто-нибудь скажет мне, как сделать его «NotFound» или что-то, когда требуемые параметры отсутствуют. И у меня есть много функций с такими требованиями, поэтому, если есть общая настройка в маршрутизации или что-то, что я действительно ценю, если кто-то может мне помочь.

Спасибо ребята

+0

Можете ли вы показать нам свою конфигурацию маршрутизации? – antonienko

+0

маршрутизатор по умолчанию. Ничего лишнего – user1217974

ответ

1

Вы можете перехватить диспетчеру событие beforeExecuteRoute и использовать некоторые интроспекции вашего целевого метода:

 if ($event->getType() == 'beforeExecuteRoute') { 
      $cn = $dispatcher->getNamespaceName().'\\'.$dispatcher->getHandlerClass(); 
      $r = new ReflectionMethod($cn, $dispatcher->getActiveMethod()); 
      $method_params = $r->getParameters(); 
      $url_pars = $dispatcher->getParams(); 
      $pass = true; 
      $i = 0; 
      foreach ($method_params as $param) { 
       if(!$param->isOptional() && !isset($url_pars[$i++])) { 
        $pass = false; 
       } 
      } 
      if(!$pass) { 
       return $dispatcher->forward(array('controller' => 'error', 'action' => 'route404')); 
      } 
      return true; 
     } 

Этот кусок кода для диспетчерской службы.

Если вы не обеспечиваете параметр GET для параметров каждого действия, которые не имеют значения по умолчанию (isOptional ложна в данном случае) переменная $pass установлена ​​в ложь, и вы будете быть направлены на 404.

Это случай, конечно, более сложное условие позволит вам более мелкозернистый контроль.

Смежные вопросы