Je pense que vous ne devriez pas récupérer le conteneur dans le constructeur directement. Au lieu de cela, récupérez-le dans la méthode configure
ou dans la méthode execute
méthode. Dans mon cas, j'obtiens mon gestionnaire d'entités juste au début de la méthode execute
comme ceci et tout fonctionne bien (testé avec Symfony 2.1).
protected function execute(InputInterface $input, OutputInterface $output)
{
$entityManager = $this->getContainer()->get('doctrine')->getEntityManager();
// Code here
}
Je pense que l'instanciation de l'objet d'application n'est pas encore faite quand vous appelez getContainer
dans votre constructeur, ce qui entraîne cette erreur. L'erreur provient du getContainer
méthode à faire :
$this->container = $this->getApplication()->getKernel()->getContainer();
Depuis getApplication
n'est pas encore un objet, vous obtenez l'erreur disant ou vous appelez une méthode getKernel
sur un non-objet.
Mise à jour : Dans une version plus récente de Symfony, getEntityManager
a été déprécié (et aurait pu être supprimé complètement à l'heure actuelle). Utilisez $entityManager = $this->getContainer()->get('doctrine')->getManager();
à la place. Grâce à Chausser pour l'avoir signalé.
Mise à jour 2 : Dans Symfony 4, le câblage automatique peut être utilisé pour réduire la quantité de code nécessaire.
Créer un __constructor
avec un EntityManagerInterface
variable. Cette variable sera accessible dans le reste de vos commandes. Ceci suit le schéma d'injection de dépendances à câblage automatique.
class UserCommand extends ContainerAwareCommand {
private $em;
public function __construct(?string $name = null, EntityManagerInterface $em) {
parent::__construct($name);
$this->em = $em;
}
protected function configure() {
**name, desc, help code here**
}
protected function execute(InputInterface $input, OutputInterface $output) {
$this->em->getRepository('App:Table')->findAll();
}
}
Crédits à @profm2 pour avoir fourni le commentaire et l'exemple de code.
0 votes
J'ai la même erreur lorsque (et je tente d'accéder à
getContainer()
à l'intérieur deMyCommand->execute()
mais je reçois toujours la même erreur fatale.CommandTest extends \PHPUnit_Framework_Testcase
et je l'exécute viaphpunit -c app src/CompanyName/MyBundle/Tests/Commands/MyCommandTest.php
Une idée de ce qui peut être mauvais ?