Могу ли я отменить действие Zend Controller в методе init ()? - PullRequest
6 голосов
/ 19 октября 2010

Во время Zend_Controller_Action::init() есть ли способ отменить действие (чтобы оно не вызывалось)?

<?php
class JsonApiController extends Zend_Controller_Action {
    function init()
    {
        // try JSON decoding the raw request body
        if ($jsonDecodingFailed) {
            echo '{"error":"invalid JSON"}';
            $this->_cancelAction(); // something like this exist?
        }
    }
}

Мой текущий обходной путь - создать пустой метод nullAction() и вызвать $this->_forward('null') для пересылки.

Ответы [ 5 ]

2 голосов
/ 16 августа 2011

Может быть попробовать это:

$this->_helper->viewRenderer->setNoRender();
return;
2 голосов
/ 19 октября 2010

Я бы сгенерировал исключение (а затем перехватил его в контроллере ошибок) - это то, что вы делаете, когда возникает неисправимая ошибка.

2 голосов
/ 19 октября 2010

Нет ничего плохого в использовании $ this -> _ forward () внутри init () (если метод, который вы хотите переадресовать, находится внутри того же контроллера, что и init ()), это просто изменит контроллер объекта запроса / действие (переписать то, что было установлено через маршрутизатор).

Альтернативой этому может быть создание Zend_Controller_Plugin, так как похоже, что вы обрабатываете непредвиденные ошибки. Посмотрите на реализацию Zend_Controller_Plugin_ErrorHandler. Поэтому вместо переадресации на другое действие вы бы сгенерировали исключение, и ваш собственный плагин проверял в postDispatch (), если ответ содержит исключения eny, и если он просто редактирует текущий объект запроса, чтобы показать ваше действие «отмена».

$request->setDispatched(false)
        ->setControllerName("error")
        ->setActionName("jsonDecoding");

Последний способ может состоять в том, чтобы просто выбросить выход после эха "{error:" invalid json "}" не очень хорошо, но вы избежите перегрузки, вызванной другой итерацией диспетчеризации.

1 голос
/ 16 ноября 2012

Для кого-то, кто все еще ищет решение, вы можете попробовать это: Добавить флаг, указывающий, есть ли ошибка или нет, и переопределить метод отправки.Если флаг установлен, не вызывайте parent::dispatch.

. Это работает так, как я хочу.Моя причина состояла в том, что я делаю абстрактный контроллер API, который по умолчанию проверяет наличие ключа API в запросе, если его там нет - контроллер должен ответить с ошибкой и успешно завершить запрос.

Например

abstract class Api_Controller extends Zend_Rest_Controller{
 private $responded = false;
 public function init() {
    parent::init();
    if(!$this->isKeyValid())
       $this->respond("invalid key"); // this would set flag to true and handle error
 }
 public function dispatch($action) {
    // if an error occured and it was dispatched, do not call action method, just finish request
    if(!$this->responded)
        parent::dispatch($action);
 }
}

Для меня это похоже на чистое решение.

0 голосов
/ 28 июня 2011

В соответствии с документацией (в разделе «Крюки до и после отправки») вызов _forward () в preDispatch () пропустит действие.

В частности, о preDispatch (): «его основная цель - принять решение о том, следует ли отправлять запрошенное действие. Если нет, то вы должны затем _forward () выполнить другое действие или вызвать исключение."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...