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 :

Flush dans Command [3.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut Flush dans Command
    Bonjour,

    Je cherche à mettre à jour un champ d'une entité utilisateur.

    Toute la commande se déroule correctement mais le flush ne fonctionne jamais.

    J'ai essayé de récupérer le manager avec tous les cas suivants sans succès :
    • $this->objectManager; (ObjectManager dans la déclaration de la commande correspond à @doctrine.orm.entity_manager)
    • $this->getContainer()->get('doctrine')->getManager()
    • $this->getContainer()->get('doctrine')->getEntityManager()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    <?php
     
    namespace App\CoreBundle\Command;
     
    use App\CoreBundle\Entity\User;
    use App\CoreBundle\Entity\UserRepository;
    use Doctrine\ORM\EntityManager;
    use Psr\Log\LoggerInterface;
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputOption;
    use Symfony\Component\Console\Output\OutputInterface;
     
     
    /**
     * App\CoreBundle\Command\TvdfSyncCommand
     */
    class TvdfSyncCommand extends ContainerAwareCommand
    {
        /**
         * @var LoggerInterface
         */
        private $logger;
     
     
        /**
         * @var EntityManager
         */
        private $objectManager;
     
     
        /**
         * @var UserRepository
         */
        private $userRepository;
     
     
        /**
         * @param UserRepository $userRepository
         */
        public function __construct(LoggerInterface $logger, EntityManager $objectManager, UserRepository $userRepository)
        {
            parent::__construct();
     
     
            $this->logger = $logger;
            $this->objectManager = $objectManager;
            $this->userRepository = $userRepository;
        }
     
     
        /**
         * {@inheritDoc}
         */
        public function configure()
        {
            $this
                ->setName('test:update:city')
                ->setDescription('Description')
                ->setDefinition([
                    new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Dry run mode'),
                ]);
        }
     
     
        /**
         * {@inheritDoc}
         */
        public function execute(InputInterface $input, OutputInterface $output)
        {
            $em = $this->objectManager;
            $user = $this->userRepository->findOneById(1);
            $user->setCity('Paris');
            $em->persist($user);
            $em->flush();              // flush ne fonctionne pas, la bdd n'est pas mise à jour
        }
    }
    Merci par avance de votre aide.
    développeur en folie cherche à ... développer encore plus

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Points : 1 022
    Points
    1 022
    Par défaut
    Bonjour,
    une première proposition, est d'afficher l'objet dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $output->writeln(dump($user));
    il se peut qu'il n'est pas très prêt pour un flush .

    une deuxième proposition, tu fais comme moi, une service ailleurs qui fait tout le traitement et juste un appel dans la command.

    bonne journée.

  3. #3
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Bonjour,

    Citation Envoyé par mehrezlabidimehrez Voir le message
    il se peut qu'il n'est pas très prêt pour un flush .
    Comment savoir s'il est prêt ou pas ? L'objet en soit est bien à jour lui en tout cas j'ai déjà fait le dump.

    Oui pour le service, je suis en train de voir cela, mais ça me paraît bizarre quand même de ne pas pouvoir mettre à jour des entités dans une commande.

    Merci.
    développeur en folie cherche à ... développer encore plus

  4. #4
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    il y a une époque fort lointaine dans mon code j'avais mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $em = $this->getContainer()->get('doctrine')->getManager();

  5. #5
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par dukoid Voir le message
    il y a une époque fort lointaine dans mon code j'avais mis ça :
    Oui ça fait parti des cas que j'ai testé comme indiqué dans mon 1er message
    développeur en folie cherche à ... développer encore plus

  6. #6
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    J'ai continué mes recherches et tout cela est très obscure pour moi.

    En effet, en mettant dans logs dans le service que j'ai créé pour tester sous cette forme, avant le flush, mon entité est bien modifiée.
    Par contre, juste après le flush, d'une part il n'y a rien en bdd, mais de plus mon entité a perdu toutes ses modifications !

    De plus, mon entité se modifie bien via l'application standard, c'est uniquement via la commande que ça coince.

    Quelqu'un aurait une idée ?
    développeur en folie cherche à ... développer encore plus

  7. #7
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Tu ne te trouves pas dans une transaction par hasard ? Auquel cas il faudrait rajouter le commit.

    Il y a des systèmes ou l'auto-commit n'est pas activé par défaut : je ne sais pas comment c'est géré d'un point de vue de Symfony, mais tu peux toujours tester de rajouter un commit après ton flush.

    Sinon tu as des listeners qui écoute le onFlush de doctrine qui pourrait altérer ton enregistrement de manière silencieuse ?

  8. #8
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Nico_F Voir le message
    Tu ne te trouves pas dans une transaction par hasard ? Auquel cas il faudrait rajouter le commit.

    Il y a des systèmes ou l'auto-commit n'est pas activé par défaut : je ne sais pas comment c'est géré d'un point de vue de Symfony, mais tu peux toujours tester de rajouter un commit après ton flush.

    Sinon tu as des listeners qui écoute le onFlush de doctrine qui pourrait altérer ton enregistrement de manière silencieuse ?
    Bonsoir,
    Merci de votre retour.
    Dans Symfony c'est en commit auto, d'autant que mon code fonctionne parfaitement hors commande.
    développeur en folie cherche à ... développer encore plus

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Les commandes symfony disposent de l'option '-vvv' pour afficher les logs dans la console, notamment ceux des requetes SQL executé par Doctrine.

    lance la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    app/console test:update:city -vvv
    cela te mettra peux être sur une piste

  10. #10
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Un peu de XDebug en pas à pas à l'intérieur du flush permettrait de mieux cibler le souci à mon avis.

    Soit dit en passant, ça ne règle pas le problème de base mais dans ton exemple le persist ne sert à rien. Si tu récupères ton objet en faisant un find, ton objet est déjà managé par l'ORM

  11. #11
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Bonsoir,

    @arnooo999
    Merci pour cette information, je pensais que c'était que si cette option était piloté par la commande qu'elle fonctionnait, et vu que c'est une commande personnalisée, je ne l'ai pas testé, je vais essayé.


    @Nico_F
    Je ne sais pas comment fonctionne XDebug mais je vais me renseigner dessus.
    Par contre, merci bien pour le persist, j'ai appris quelque chose .
    développeur en folie cherche à ... développer encore plus

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

Discussions similaires

  1. comment faire un appel RPC dans Command
    Par groupe dans le forum GWT et Vaadin
    Réponses: 7
    Dernier message: 27/06/2008, 11h36
  2. select dans commande prompt
    Par all4linux dans le forum Sql*Plus
    Réponses: 8
    Dernier message: 21/11/2007, 15h17
  3. Indirection dans commande SQL
    Par lolomrs dans le forum SQL
    Réponses: 3
    Dernier message: 19/06/2007, 10h05
  4. Flush dans SQL server 2000
    Par al1EnC dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/03/2007, 22h06
  5. Probleme avec guillemets dans commande HREF
    Par angelevil dans le forum ASP
    Réponses: 4
    Dernier message: 02/05/2005, 19h06

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