web-dev-qa-db-fra.com

Phalcon redirection et redirection

Dois-je bien comprendre qu'après avoir utilisé $this->dispatcher->forward() ou $this->response->redirect(), je dois m'assurer manuellement que le reste du code ne soit pas exécuté? Comme ci-dessous, ou est-ce que je manque quelque chose?

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

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

Après presque un an de travail sur un projet hardcore utilisant Phalcon au-delà de ses capacités, je souhaitais clarifier quelques points et répondre à ma propre question. Pour comprendre comment faire correctement les redirections et les transferts, vous devez comprendre un peu le fonctionnement de la méthode Dispatcher :: dispatch

Jetez un coup d'œil au code ici , bien que ce soit pour le plupart d'entre nous un charabia en C, il est vraiment bien écrit et documenté. En bref c'est ce qu'il fait:

  1. Le répartiteur entre la boucle while jusqu'à ce que la propriété _finished devienne true ou qu'il découvre une récurrence.
  2. À l'intérieur de la boucle, il a immédiatement définit cette propriété sur true. Ainsi, au démarrage de la prochaine itération, il _ sera automatiquement interrompu break .
  3. Il obtient ensuite les informations contrôleur/action, fournies à l'origine par le routeur dans l'application, et effectue diverses vérifications. Avant et après cela, il achève également de nombreuses activités liées aux événements.
  4. Enfin, appelle la méthode d'action dans le contrôleur et met à jour la propriété _returnedValue avec (devinez quoi!) La valeur renvoyée.
  5. Si, au cours de l'appel à l'action, vous appelez la méthode Dispatcher::forward, il mettra à jour la propriété _finished en false, ce qui permettra à la boucle while de continuer à partir de l'étape 2 de cette liste.

Ainsi, après la redirection ou le transfert, vous devez vous assurer que votre code n'est pas exécuté uniquement s'il fait partie de la logique attendue. En d'autres termes, vous n'avez pas à renvoyer le résultat de return $this->response->redirect ou return $this->dispatcher->forward.

Faire le dernier peut sembler pratique, mais pas très correct et peut entraîner des problèmes. Dans 99,9% des cas, votre contrôleur ne doit rien renvoyer. L'exception serait lorsque vous savez réellement ce que vous faites et que vous voulez changer le comportement du processus de rendu dans votre application en renvoyant l'objet de réponse. En plus de cela, votre IDE pourrait se plaindre des déclarations de retour incohérentes.

Pour finaliser, la bonne façon de rediriger depuis le contrôleur:

// 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; 

Et à transmettre:

$this->dispatcher->forward(['action' => 'profile']);

// Again, exit if you don't need the rest of the logic.

return;
27
Ian Bytchek

Vous devez l'utiliser comme ceci:

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

ou 

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

Utilisez send () comme ceci

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