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…
}
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:
_finished
devienne true
ou qu'il découvre une récurrence.true
. Ainsi, au démarrage de la prochaine itération, il _ sera automatiquement interrompu break ._returnedValue
avec (devinez quoi!) La valeur renvoyée.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;
Vous devez l'utiliser comme ceci:
return $this->response->redirect('/profile');
ou
return $this->dispatcher->forward(array(
'action' => 'profile'
))
Utilisez send () comme ceci
public function signinAction()
{
if ($this->isUserAuthenticated())
{
return $this->response->redirect('profile')->send();
}
}