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