Redirection Phalcon et transfert
Dois-je comprends bien qu'après avoir fait $this->dispatcher->forward()
ou $this->response->redirect()
j'ai besoin de vérifier manuellement que le reste du code n'est pas exécuté? Comme ci-dessous, ou ai-je raté quelque chose?
public function signinAction()
{
if ($this->isUserAuthenticated())
{
$this->response->redirect('/profile');
return;
}
//Stuff if he isn't authenticated…
}
source d'informationauteur Ian Bytchek
Vous devez vous connecter pour publier un commentaire.
Après presque une année de travail sur un projet de hardcore qui utilise Phalcon au-delà de sa capacité, je tenais à préciser un peu les choses et répondre à ma propre question. Pour comprendre comment bien faire les redirections et les transfère vous avez besoin de comprendre un peu comment le Dispatcher::dispatch méthode fonctionne.
Prendre un coup d'oeil au code icisi c'est tout le C du charabia pour la plupart d'entre nous, c'est vraiment bien écrit et documenté. En bref c'est ce qu'il fait:
_finished
propriété devienttrue
ou il découvre une récursivité.true
donc quand il commence la prochaine itération, il sera automatiquement pause._returnedValue
bien avec (devinez quoi!) la valeur retournée.Dispatcher::forward
méthode, il mise à jour la_finished
propriétéfalse
ce qui permettra à la boucle while pour continuer à partir de l'étape 2 de cette liste.Ainsi, après avoir fait de rediriger ou de l'avant, vous devez vous assurer que vous avez le code n'est pas exécuté seulement si c'est la partie de la logique. En d'autres termes, vous n'avez pas à retourner le résultat de
return $this->response->redirect
oureturn $this->dispatcher->forward
.À faire le dernier peut sembler pratique, mais pas très correct et pourrait conduire à des problèmes. Dans 99,9% des cas, votre contrôleur ne doit pas retourner quoi que ce soit. L'exception concerne le cas où vous savez vraiment ce que vous faites et souhaitez changement le comportement du processus de rendu de votre demande par le renvoi de l'objet de réponse. Sur le dessus de votre IDE pourraient se plaindre incompatible avec l'instruction return.
À finaliser, la bonne façon de redirection à partir de l'intérieur du contrôleur:
Et à l'avant:
Vous avez besoin de l'utiliser comme ceci:
ou
Utiliser send() comme ceci