CakePHP - Controller :: flash () не перенаправляет - PullRequest
2 голосов
/ 21 марта 2012

Использование CakePHP 2.1 У меня есть следующий код

public function getForm($id=null){
        $this->loadModel('DynamicFormResponse');
        /**
         *  Check if form exists 
         */
        $this->form_schema= $this->DynamicForm->isValidForm($id);

        if($this->form_schema == false){
            $this->flash("Invalid form", $this->referer(
                    array('controller'=>"pages", 'action' => 'display')
                    ));           
        }
     ...
     ...

Проблема, с которой я сталкиваюсь, заключается в том, что вызов $this->flash() отображает флэш-страницу, но также продолжает выполнение контроллера.

Так что, если я не сделаю что-то вроде

if($this->form_schema == false){
    $this->flash("Invalid form", $this->referer(
        array('controller'=>"pages", 'action' => 'display')
    ));
    return;           
}

, контроллер не завершит работу.

Основная проблема возникает, когда вызывается метод _crsf_error

function _csrf_error() {

    $this->flash("csrf Error",  $this->referer(
            array('controller'=>"pages", 'action' => 'display')
    ));
}

Так как метод flash не перенаправляет, он не предлагает никакой защиты csrf вообще.Использование return; после $this->flash() в методе _crsf_error не работает.

PS: Полный код доступен здесь

Ответы [ 3 ]

6 голосов
/ 09 марта 2013

Хотя приведенный выше ответ является отличным объяснением того, что делает метод flash (), для меня он не полностью отвечает на вопрос, а скорее дает отличную альтернативу.

Лично я хотел использовать метод флэш-памяти, поэтому мне не пришлось использовать компонент сеанса, и я тоже застрял в своем флэш-сообщении. В документации к торту 2.x говорится, что вторым параметром метода flash () является URL, относящийся к CakePHP. Это означает, что следующее должно показать сообщение и затем перенаправить на действие index.

$this->flash(__("Some message for the user here..."), array("action" => "index"));

Моя проблема и то, что она выглядела как проблема оригинального плаката, заключалась в том, что он показывал вам флэш-сообщение, но не делал перенаправление после.

Я тщательно протестировал это с моим приложением, и виновником была настройка отладки в core.php

Configure::write('debug', 0);

Значение отладки должно быть установлено в «0», чтобы происходило перенаправление. Я не знаю, почему это так, но я протестировал его около 10 раз, и 10/10, когда мои настройки отладки были установлены на 1 или выше, я только что получил флэш-сообщение. Если я установлю его на 0, все работает отлично. Меня это не особо беспокоило, поскольку в производственных средах этот параметр должен быть равен 0.

Если у кого-то еще есть понимание того, почему перенаправление не происходит при включенной отладке, просим всех нас просветить.

Надеюсь, это поможет.

5 голосов
/ 21 марта 2012

flash() не перенаправляет, он рендерит.Она очень похожа на функцию render(), она продолжит выполнение скрипта, в отличие от функции redirect().

Вам просто нужно соответствующим образом организовать свою логику, чтобы после нее не выполнялась никакая другая строка, если вы этого не хотите.При желании вы можете использовать session->setFlash() в сочетании с перенаправлением.

При работе с серьезными ошибками, такими как недействительный токен csrf, я бы рекомендовал выдавать исключение вместо того, чтобы выдавать атакующему приятное сообщение.Тем не менее, вы можете предварительно обработать исключение, используя обработчик ошибок.

1 голос
/ 02 июня 2013

Я тоже столкнулся с той же проблемой.И после переключения режима отладки в 0, я получил решение моей проблемы.

Configure :: write ('debug', 0);

И почему перенаправление не происходит в режиме отладки 2, есть одна главная причина,

, которое выводит ваше приложениечто-то в браузер до отправки заголовка перенаправления.Это может быть вызвано (невидимым) пробелом до или после любого.Это вызовет предупреждение «заголовки уже отправлены», и браузер не будет перенаправлять.Есть много вопросов относительно этой ситуации здесь, в StackOverflow, например: Заголовки уже отправлены PHP

...