test standalone print php console symfony

php - standalone - ¿Cómo usar mis Entidades y Administradores de Entidades en el Comando de la Consola Symfony 2?



symfony print console (3)

Creo que no deberías recuperar el contenedor en el constructor directamente. En su lugar, recupérelo en el método de configure o en el método de execute . En mi caso, obtengo mi administrador de entidades justo al comienzo del método de execute así y todo está funcionando bien (probado con Symfony 2.1).

protected function execute(InputInterface $input, OutputInterface $output) { $entityManager = $this->getContainer()->get(''doctrine'')->getEntityManager(); // Code here }

Creo que la creación de instancias del objeto de la aplicación aún no está completa cuando llamas a getContainer en tu constructor, lo que da como resultado este error. El error proviene del método getContainer tyring para hacer:

$this->container = $this->getApplication()->getKernel()->getContainer();

Como getApplication todavía no es un objeto, obtienes un error al decir o llamar a un método getKernel en un no objeto.

Actualización : en la versión más nueva de Symfony, getEntityManager ha quedado en desuso (y podría haber sido eliminado del todo por ahora). Utilice $entityManager = $this->getContainer()->get(''doctrine'')->getManager(); en lugar. Gracias a Chausser por señalarlo.

Actualización 2 : en Symfony 4, el auto-cableado puede usarse para reducir la cantidad de código necesario.

Cree un __constructor con una variable EntityManagerInterface . Esta variable estará accesible en el resto de tus comandos. Esto sigue el esquema de Inyección de Dependencia de auto-cableado.

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éditos a @ profm2 para proporcionar el comentario y la muestra del código.

Quiero algunos comandos de terminal para mi aplicación Symfony2. He analizado el ejemplo en el libro de cocina , pero no pude encontrar cómo acceder a mi configuración, a mi administrador de entidades y a mis entidades aquí. En el constructor, obtengo el contenedor (que me debe dar acceso a configuraciones y entidades) usando

$this->container = $this->getContainer();

Pero esta llamada genera un error:

Error fatal: llamada a una función miembro getKernel () en un no objeto en /Users/fester/Sites/thinkblue/admintool/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand.php en la línea 38

Básicamente, en ContainerAwareCommand-> getContainer () la llamada a

$this->getApplication()

devuelve NULL y no un objeto como se esperaba. Supongo que dejé un paso importante, ¿pero cuál? ¿Y cómo podré finalmente usar mi configuración y entidades?


Sé que la respuesta de Matt resolvió la pregunta, pero si tienes más de un administrador de entidades, puedes usar esto:

Hacer model.xml con:

<?xml version="1.0" encoding="UTF-8" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="EM_NAME.entity_manager" alias="doctrine.orm.entity_manager" /> </services> </container>

A continuación, cargue este archivo en su extensión DI

$loader = new Loader/XmlFileLoader($container, new FileLocator(__DIR__.''/../Resources/config'')); $loader->load(''model.xml'');

Entonces puedes usarlo en cualquier lugar. En el comando de la consola, ejecute:

$em = $this->getContainer()->get(''EM_NAME.entity_manager'');

y no olvide al final:

$em->flush();

Ahora puede usarlo como argumento en otro servicio en services.yml:

services: SOME_SERVICE: class: %parameter.class% arguments: - @EM_NAME.entity_manager

Espero que esto ayude a alguien.


extiende su clase de comando desde ContainerAwareCommand en lugar de Command

class YourCmdCommand extends ContainerAwareCommand

y obtenga el administrador de la entidad así:

$em = $this->getContainer()->get(''doctrine.orm.entity_manager'');