Вы не можете использовать getContainer, потому что ваш командный класс не знает о контейнере.
Расширение вашей команды ContainerAwareCommand
Так что вы можете использовать getContainer ()
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
Затем расширяет ContainerAwareCommand :
class MyCommand extends ContainerAwareCommand
А затем используйте его где угодно:
$em = $this->getContainer()->get('doctrine')->getManager('default');
РЕДАКТИРОВАТЬ благодаря @ tomáš-votruba:
ОДНАКО Контейнерное ПО устарело в Symfony 4:
Использование EntityManager путем введения его:
Таким образом, вместо принудительного получения менеджера сущностей с контейнером, вместо этого введите в свой конструктор и расширьте Command на , используя вашу команду в качестве службы :
namespace App\Command;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Console\Command\Command;
class MyCommand extends Command {
//add $entityManager attribute
private $entityManager;
public function __construct(ObjectManager $entityManager)
{
$this->entityManager= $entityManager;
// you *must* call the parent constructor
parent::__construct();
}
Как вы можете видеть в конструкторе, мы внедряем entityManager с ObjectManager, который является интерфейсом, тогда как EntityManager является его реализацией ORM, вы можете сделать это, если вы используете services.yml по умолчанию или тот, который настроен на автопроводку:
# config/services.yaml
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
public: false # Allows optimizing the container by removing unused services; this also means
# fetching services directly from the container via $container->get() won't work.
# The best practice is to be explicit about your dependencies anyway.