$this->dispatcher->forward()
または$this->response->redirect()
を実行した後、残りのコードが実行されないことを手動で確認する必要があることを正しく理解していますか?以下のように、または何か不足していますか?
public function signinAction()
{
if ($this->isUserAuthenticated())
{
$this->response->redirect('/profile');
return;
}
// Stuff if he isn't authenticated…
}
Phalconをその能力を超えて使用するハードコアプロジェクトにほぼ1年取り組んだ後、いくつかのことを明確にし、自分の質問に答えたかった。リダイレクトと転送を適切に行う方法を理解するには、 Dispatcher :: dispatch メソッドがどのように機能するかについて少し理解する必要があります。
コードを見てみましょう here ですが、ほとんどすべての人にとってCのmumbo-jumboですが、実際によく記述され、文書化されています。一言で言えば、これはそれがすることです:
_finished
プロパティがtrue
またはit discovers 再帰になるまでwhileループ。true
に設定されるため、次の反復を開始すると、自動的に break になります。_returnedValue
プロパティを使用します。Dispatcher::forward
メソッドを呼び出すと、 pdate_finished
プロパティがfalse
に戻ります。これにより、whileループがこのリストのステップ2。したがって、リダイレクトまたは転送を行った後、コードが実行されないことを確認する必要がありますonly予想されるロジックの一部である場合。つまり、return $this->response->redirect
またはreturn $this->dispatcher->forward
の結果を返す必要はありません。
最後を行うことは便利に思えるかもしれませんが、あまり正確ではなく、問題を引き起こす可能性があります。 99.9%の場合、コントローラーは何も返しません。例外は、実際に何をしているのかを理解していて、応答オブジェクトを返すことによって、アプリケーションのレンダリングプロセスの動作を change にしたい場合です。その上、あなたのIDEは一貫性のないreturnステートメントについて文句を言うかもしれません。
最終的に、コントローラー内からリダイレクトする正しい方法:
// Calling redirect only sets the 30X response status. You also should
// disable the view to prevent the unnecessary rendering.
$this->response->redirect('/profile');
$this->view->disable();
// If you are in the middle of something, you probably don't want
// the rest of the code running.
return;
そして転送する:
$this->dispatcher->forward(['action' => 'profile']);
// Again, exit if you don't need the rest of the logic.
return;
次のように使用する必要があります。
return $this->response->redirect('/profile');
または
return $this->dispatcher->forward(array(
'action' => 'profile'
))
このようにsend()を使用します
public function signinAction()
{
if ($this->isUserAuthenticated())
{
return $this->response->redirect('profile')->send();
}
}