IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Effectuer une redirection depuis un service [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 154
    Points
    154
    Par défaut Effectuer une redirection depuis un service
    Bonjour,

    J'aimerai sécuriser une entité en empêchant sa suppression en cas de certaines conditions.
    J'ai donc pensé à un événement preRemove afin d'être sûre que cette vérification s'effectue.

    Ma question est simple : comment stopper toutes actions depuis une classe paramétré comme service en effectuant une redirection vers une route ?
    La fonction redirect() étant une méthode de Controller et non d'un service particulier, je sèche un peu.

    Merci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    La couche service ne doit pas être couplée avec HTTP, une redirection dans un service est donc une mauvaise idée. Un service ne doit même pas être au courant que les routes existent ou qu'il est dans une application web.

    La méthode de ta classe service doit lancer une exception ou retourner false ou un code d'erreur, et c'est à ton controlleur de lancer la redirection lorsqu'il reçoit cette exception/erreur/code.

  3. #3
    Membre habitué
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 154
    Points
    154
    Par défaut
    Bonjour,

    Je comprend le principe et j'aurais fait comme cela si c'est je faisait appel au service depuis un contrôleur.
    Mais dans ce cas, c'est le kernel qui fait appel au service via les événement de Doctrine (preRemove).

    Dans mon controleur qui supprime l'entité, je fais mes test.
    Mais j'aimerais sécuriser pour être sûre que l'entité ne sera pas supprimé en cas de cascade par exemple (ou un oubli autre part dans le code)

    Je peut retourner une exception, mais celà affichera une belle erreur 500 et c'est ce que j'aimerai éviter

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Dans ce cas, injecte les routes dans ta classe service (dans le constructeur), et ensuite utilise la classe RedirectResponse dans ta méthode pour faire la redirection.

  5. #5
    Membre habitué
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 154
    Points
    154
    Par défaut
    Bonjour,

    Si je retourne un objet RedirectResponse, il n'y pas de redirection (logique vu que le kernel n'attend rien de l'événement).

    J'ai trouvé une solution bis :
    Je détache l'entité dans l'événement preRemove :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function preRemove(LifecycleEventArgs $args)
    	{
    	$args->getEntityManager()->detach($args->getEntity());
    	}
    De cette manière, elle n'est pas effacée.

    Concernant la redirection, je contourne en utilisant les flashbag:
    - 1 flashbag dans preRemove si l'entité est détaché pour prévenir l'utilisateur
    - 1 flashbag dans postRemove pour confirmer la supression.

    Merci pour ton aide.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Pas retourner un RedirectResponse, mais en créer un puis utiliser sa méthode send();

    Mais c'est de toute façon une sale solution, comme je le disais au début. Ta solution est plus propre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lancer une application depuis un service ?
    Par bhf37 dans le forum Langage
    Réponses: 7
    Dernier message: 05/03/2009, 14h05
  2. Comment effectuer une redirection après un clic sur un lien
    Par Angelik dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/11/2007, 22h13
  3. Réponses: 9
    Dernier message: 11/01/2007, 21h23
  4. [Système] Comment effectuer une redirection
    Par RKU01 dans le forum Langage
    Réponses: 2
    Dernier message: 01/01/2007, 21h00
  5. Effectuer une redirection sous Free
    Par nerick dans le forum Langage
    Réponses: 1
    Dernier message: 11/11/2006, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo