命令中的symfony3访问实体管理器

韦伯

如何EntityManager从Symfony 3中的命令访问应该是ContainerAware

这是我的代码:

use Symfony\Component\Console\Command\Command;
class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $em = $this->getContainer()->getDoctrine();
        ...
    }
}

我得到这个错误:

未捕获的Symfony \ Component \ Debug \ Exception \ UndefinedMethodException:试图调用类“ AppBundle \ Command \ MyCommand”的名为“ getContainer”的未定义方法

如果我从Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand(symfony 2方式)扩展,也会发生这种情况

此外,注射Doctrine\ORM\EntityManager__construct()没有工作。

迪伦·卡斯(Dylan Kas)

您不能使用getContainer,因为您的命令类无法识别该容器。

使您的命令扩展ContainerAwareCommand

这样就可以使用getContainer()

 use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

然后扩展ContainerAwareCommand

class MyCommand extends ContainerAwareCommand

然后在任何需要的地方使用它:

$em     = $this->getContainer()->get('doctrine')->getManager('default');

编辑感谢@ tomas-votruba:

但是,Symfony 4中不推荐使用ContainerAware

通过注入使用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();
}

如您在构造函数中看到的那样,我们向ObjectManager注入了ObjectManager,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.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在自定义实现中访问配置了Spring Data的实体管理器(工厂)

Symfony-在表单的EventSubscriber中注入实体管理器

Symfony Doctrine DQL在实体管理器中找不到createQuery

具有多个数据库的Symfony 3表单始终使用默认实体管理器

依赖关系将非默认实体管理器注入到Symfony中的服务中

刷新UserTransaction中的实体管理器时,TransactionRequiredException

在config.php中访问实体管理器

如何在Zend Framework 3中的实体管理器配置原则中添加功能

Symfony Insight:如何防止CustomIdGenerator出现“参数中没有实体管理器”的警告?

如何在symfony 4中为一个方向使用两个实体管理器

Symfony表单错误:必须管理传递给选择字段的类型为“ ...”的实体。也许您忘记将其保留在实体管理器中

在Awesome窗口管理器中配置运行命令

Symfony2从elendev小部件包访问实体管理器

如何在Dart Pub包管理器中访问命令行

i3窗口管理器:命令中的与号(&)

在Typo3中访问扩展管理器时出现Apache错误

由实体管理器管理的实体在堆内存中是否有2个对象?

在命令Symfony3中设置详细

命令行提示从文件资源管理器快速访问中取消文件夹的固定

插入新游戏时出现Symfony错误:必须管理传递到选择字段的实体。也许将它们保存在实体管理器中?

Symfony 实体管理器的性能

Symfony3 QueryBuilder orderBy 实体字段

symfony3 逆实体映射缓慢

在 Symfony3 中创建实体管理器?

从 Doctrine 实体 (Symfony3) 中获取所有值

Symfony3 - 将服务引入实体

为 Symfony5 Bundle 实体配置第二个实体管理器

Symfony 也许你忘记在实体管理器中持久化它?

如何为 Symfony 实体定义默认实体管理器