0
votes

Commande personnalisée Symfony3.4

J'essaye de créer une commande personnelle pour changer les données de ma base de données. Je pourrais le faire directement avec un "SELECT *" ... mais Symfony dit que la bonne méthode est de créer une commande pour appliquer des changements dans la base de données, etc ... C'est donc le problème auquel je suis confronté:

Lorsque je remplace la méthode __construct par défaut, la commande n'est pas automatiquement enregistrée par Symfony, ce qui signifie que Symfony l'ignore simplement. Quand je supprime le constructeur, ma commande fonctionne mais j'obtiens juste null de mon $ entitymanager (ce qui est logique puisque je ne mets rien dans entitymanager?).

Quelqu'un a-t-il une solution pour moi s'il vous plaît? Désolé pour mon mauvais anglais et merci pour votre aide :)

Voici donc mon code pour la commande


1 commentaires

N'utilisez pas d'images dans les questions. Copiez / collez simplement votre code constructeur. Je soupçonne que vous n'appelez pas le constructeur parent. Suivez l'exemple dans la documentation.


4 Réponses :


-1
votes

le parent :: __ construct doit toujours être la première ligne.

Déplacez cette ligne et cela devrait fonctionner correctement.

{
    parent::__construct();    
    $this->entityManager = $entityManager;
}


3 commentaires

L'as tu essayé? L'ordre de ces deux lignes ne fera aucune différence.


Oui, je l'ai essayé, et bien sûr, ça change quelque chose. Lorsque l'appel parent est avant, vous initiez toutes les dépendances dont vous avez besoin (comme l'enregistrement de commande, etc.).


Salut, merci pour ta réponse. Malheureusement, cela ne fonctionne pas, ma commande est toujours ignorée :(.



0
votes

Version de Symfony?

Cependant, essayez ceci:

use Symfony\Component\Console\Command\Command;
[...]

class CreateUserCommand extends Command
{
    protected static $defaultName = 'app:create-user';

    /**
    * @var EntityManager
     */
    private $entityManager;

    public function __construct(
        EntityManager $entityManager,
        string $name = null
    ) {
    parent::__construct($name);
    $this->entityManager = $entityManager;

    protected function configure()
    {
        parent::configure();
        [...]
    }

        protected function execute(InputInterface $input, OutputInterface $output)
    {
        [...]
    }

}


3 commentaires

Ne fonctionne pas, je suis sur Symfony 3.4 car l'application est ancienne.


qu'est-ce que la classe s'étend?


voici mon nom de classe et étend: "class ResetPmStatusCommand extend Command" Donc ma classe étend Command



0
votes

Vous devez connecter automatiquement EntityManagerInterface $ entityManager et non EntityManager et vous assurer que le câblage automatique est activé sinon vous devez le faire manuellement dans votre service.yml


3 commentaires

Merci pour votre réponse, mon câblage automatique est défini comme "vrai" dans app / config / services.yml. J'ai essayé EntityManagerInterface mais cela ne fonctionne toujours pas. :(


Et êtes-vous sûr de ne pas exclure Command dans le câblage automatique?


Je ne pense pas, je n'ai rien dans services.yml indiquant d'exclure Command dans l'autowiring. Existe-t-il une méthode pour vérifier cela?



0
votes
Here another alternative to use entityManager in your 3.4 since autowiring is not as good as 4.0 and above 
`class CreateUserCommand extends ContainerAwareCommand
{
 protected function execute(InputInterface $input, OutputInterface $output)
    {
        $entityManager = $this->getContainer()->get('doctrine')->getManager(); 
    }
}
`

3 commentaires

Merci, j'ai un autre problème maintenant: j'attrape une erreur fatale qui est "Erreur fatale capturable: l'objet de la classe Doctrine \ ORM \ EntityManager n'a pas pu être converti en chaîne" Je vais essayer de le trouver sur Internet


D'accord, je viens de découvrir le problème que j'utilisais: "$ applications = $ this -> $ entityManager-> getRepository ('Corsaire4Bundle: Applic‌ ation') -> findAll ();" et la solution était de supprimer $ this


Veuillez le marquer comme résolu si vous trouvez ma réponse utile