2012-03-21 5 views
2

Использование CakePHP 2.1 У меня есть следующий кодCakePHP - контроллер вспышки ::() не перенаправляет

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

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

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

ответ

5

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

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

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

+0

Исключения кажутся лучшим способом справиться с этим. спасибо – Gautam

+0

setFlash устарел с версии 2.7.0: вам нужно просто использовать Flash для создания флеш-сообщений. setFlash() будет полностью удален в торте 3.0 –

6

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

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

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

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

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

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

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

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

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

+0

Хороший улов, помог мне понять, в чем проблема. – Gabriel

1

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

Конфигурация :: write ('debug', 0);

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^