2016-05-31 2 views
4

В моем проекте я создал AjaxController, который управлял аякс-запросами. Я хочу, чтобы пользователь, который вводит url, используемый ajax get 404 error. В AjaxController.php у меня есть:PhalconPHP - redirect in initialize()

public function initialize() { 
    if (!$this->request->isAjax()) { 
     return $this->response->redirect('error/show404'); 
    } 
} 

(Конечно, у меня есть ErrorController с show404Action)

Это не работает. Когда я вхожу в example.com/ajax в браузере, я получаю контент от IndexAction в AjaxController. Как отремонтировать его?

+0

Возможно, вы могли бы использовать для этого промежуточное программное обеспечение? –

ответ

3

Пожалуйста, попробуйте сделать то же самое в beforeExecuteRoute(). Phalcon's initialize() разработан, как говорится в его названии, для инициализации вещей. Вы можете отправить туда с помощью диспетчера, но не перенаправлять.

Вы можете проверить часть документации here. Столбец "может остановить работу?" говорит, что можно вернуть объект ответа для завершения запроса или false, чтобы прекратить оценивать другие методы и компилировать представление.

Один из знающих, что нужно знать, - это то, что beforeExecuteRoute() выполняет каждый раз до вызова действия, поэтому может срабатывать пару раз в случае, если вы переадресовываете свои действия.

public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher) 
{ 
    if (!$this->request->isAjax()) { 
     return $this->response->redirect('error/show404'); 
    } 
} 
0

Я бы рекомендовал переслать пользователя на 404 страницу через диспетчер. Таким образом, URL-адрес останется, и вы будете делать все согласно правилам SEO.

public function initialize() { 
    if (!$this->request->isAjax()) { 
     $this->dispatcher->forward(['controller' => 'error', 'action' => 'show404']); 
    } 
} 

Также не рекомендуется переадресации при инициализации. Дополнительная информация от Phalcon здесь: https://forum.phalconphp.com/discussion/3216/redirect-initialize-beforeexecuteroute-redirect-to-initalize-and

Добавить мой метод 404 на случай, если кому-то это понадобится. Он демонстрирует обработку (опять-таки для SEO целей) правильный заголовок

// 404 
public function error404Action() 
{ 
    $this->response->setStatusCode(404, 'Not Found'); 
    $this->view->pick(['templates/error-404']); 
    $this->response->send(); 
} 
+0

У меня есть предупреждение - форвард действует как пустота. – Robin71

+0

Мой плохой. Обновлен мой ответ выше. Скопировал ваш код и забыл удалить возврат. Извините :) –

+0

Хорошо, предупреждение исчезло, но я все равно получаю контент от IndexAction. Нет пересылки на страницу 404 :( – Robin71