Zend _forward() не работает в preDispatch()?

В настоящее время я собираю контроллер из моего приложения Zend MVC, который будет использоваться только в качестве службы json для заполнения страницы. Я хочу ограничить пользователей использовать только метод GET для доступа к этой конечной точке (по некоторым соображениям безопасности).

Я следил за этим постом _forward() в Zend не работает? но не мог получить работу.

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

public function preDispatch(){
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender();
    //Restrict this Controller access to Http GET method
    if(!($this->getRequest()->isGet())){
        return $this->_forward('error');
    }
}

public function errorAction(){
    $this->getResponse()->setHttpResponseCode(501);
    echo "Requested Method is not Implemented";
}

Когда я тестирую страницу с почтовым запросом, она выдает

Неустранимая ошибка PHP: превышено максимальное время выполнения 30 секунд

У меня это работает с

$this->_redirect("service/error");

Хотите знать, если это единственный / лучший способ справиться с этой ситуацией.

Любая помощь могла бы быть полезна. Заранее спасибо.

1 ответ

Решение

Причина, по которой зовет _forward не работает, потому что метод запроса не меняется, поэтому вы попадаете в бесконечный цикл, пытаясь переслать error действие, так как запрос всегда POST,

_forward работает путем изменения модуля, контроллера и действия, которое будет вызываться при отправке запроса, _redirect фактически возвращает редирект 302 и приводит к дополнительному HTTP-запросу браузера.

Любой метод в порядке, но я бы предпочел пойти с _forward поскольку это не потребует дополнительного HTTP-запроса (но вы все равно гарантируете POST запрос отклонен).

Этот код должен работать для вас:

    if(!($this->getRequest()->isGet())){
        // change the request method - this only changes internally
        $_SERVER['REQUEST_METHOD'] = 'GET';

        // forward the request to the error action - preDispatch is called again
        $this->_forward('error');

        // This is an alternate to using _forward, but is virtually the same
        // You still need to override $_SERVER['REQUEST_METHOD'] to do this
        $this->getRequest()
             ->setActionName('error')
             ->setDispatched(false);
    }
Другие вопросы по тегам