2015-09-11 3 views
0

Обычно в Zend Framework в конфигурации маршрутизации указывается действие и контроллер, которые должны использоваться для ответа на конкретный запрос.Zend Framework 2 - Invokable class as action

Затем в классе контроллера необходим метод somethingAction, который соответствует действию, указанному в конфигурации.

Is можно использовать метод контроллера __invoke как действие?

В противном случае можно указать любой тип вызываемого объекта вместо метода объекта?

ответ

1

Возможно ли использовать метод __invoke контроллера как действие?

Да. Абстрактный контроллер onDispatch() вычисляет what method to call. Если вы просто переопределите onDispatch() своей пользовательской логикой, вы можете вызывать любой метод, который вы хотите. Пример (не проверено):

public function onDispatch(MvcEvent $e) 
{ 
    $routeMatch = $e->getRouteMatch(); 
    if (!$routeMatch) { 
     throw new Exception\DomainException('Missing route matches'); 
    } 

    $action = $routeMatch->getParam('action', 'not-found'); 
    $method = '__invoke'; 

    if (!method_exists($this, $method)) { 
     $method = 'notFoundAction'; 
    } 

    $actionResponse = $this->$method($action); 

    $e->setResult($actionResponse); 

    return $actionResponse; 
} 

Таким образом __invoke() должен быть вызван с одним аргументом, действие это было в матче маршрута.

В противном случае можно указать любой тип вызываемого объекта вместо метода объекта?

Не совсем. ZF2 определяет контроллер с помощью интерфейса Dispatchable. Пока класс реализует этот интерфейс, это контроллер. Стандартный контроллер действий реализует onDispatch() и вычисляет действие для вызова, но это необязательно. В ZF2 невозможно использовать любые вызываемые вами вызовы.