web-dev-qa-db-ja.com

ファルコンのリダイレクトと転送

$this->dispatcher->forward()または$this->response->redirect()を実行した後、残りのコードが実行されないことを手動で確認する必要があることを正しく理解していますか?以下のように、または何か不足していますか?

public function signinAction()
{
    if ($this->isUserAuthenticated())
    {
        $this->response->redirect('/profile');
        return;
    }

    // Stuff if he isn't authenticated…
}
14
Ian Bytchek

Phalconをその能力を超えて使用するハードコアプロジェクトにほぼ1年取り組んだ後、いくつかのことを明確にし、自分の質問に答えたかった。リダイレクトと転送を適切に行う方法を理解するには、 Dispatcher :: dispatch メソッドがどのように機能するかについて少し理解する必要があります。

コードを見てみましょう here ですが、ほとんどすべての人にとってCのmumbo-jumboですが、実際によく記述され、文書化されています。一言で言えば、これはそれがすることです:

  1. ディスパッチャ enters_finishedプロパティがtrueまたはit discovers 再帰になるまでwhileループ。
  2. ループ内では、すぐに sets そのプロパティがtrueに設定されるため、次の反復を開始すると、自動的に break になります。
  3. 次に、アプリケーションのルーターによって最初に提供されたコントローラー/アクション情報を取得し、さまざまなチェックを行います。その前後にも、イベント関連のビジネスを数多く行っています。
  4. 最後に calls コントローラーのアクションメソッドと pdates 返された値を持つ_returnedValueプロパティを使用します。
  5. アクションの呼び出し中に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;
27
Ian Bytchek

次のように使用する必要があります。

return $this->response->redirect('/profile');

または

return $this->dispatcher->forward(array(
    'action' => 'profile'
))
10
crada

このようにsend()を使用します

public function signinAction()
{
    if ($this->isUserAuthenticated())
    {
        return $this->response->redirect('profile')->send();
    }
}
2
NSukonny