Symfony2:在通用PHP类中获取Doctrine


Symfony2: get Doctrine in a generic PHP class

在 Symfony2 项目中,当你使用控制器时,你可以通过在 this 上调用 getDoctrine() 来访问 Doctrine,即:

$this->getDoctrine();

通过这种方式,我可以访问这样一个教义实体的存储库。

假设在 Symfony2 项目中有一个通用的 PHP 类。如何检索教义?我想有这样的服务可以得到它,但我不知道是哪一个。

您可以将此类注册为服务,并将任何其他服务注入其中。假设你有 GenericClass.php如下所示:

class GenericClass
{
    public function __construct()
    {
        // some cool stuff
    }
}

您可以将其注册为服务(通常在捆绑包的Resources/config/service.yml|xml中),并将 Doctrine 的实体管理器注入其中:

services:
    my_mailer:
        class: Path/To/GenericClass
        arguments: [doctrine.orm.entity_manager]

它将尝试将实体管理器注入(默认情况下)GenericClass的构造函数。所以你只需要为它添加参数:

public function __construct($entityManager)
{
     // do something awesome with entity manager
}

如果不确定应用程序的 DI 容器中有哪些服务可用,可以使用命令行工具查找:php app/console container:debug,它将列出所有可用的服务及其别名和类。

在检查了symfony2文档之后,我想出了如何传递你的服务在自定义方法中中断默认行为。

像这样重写您的配置:

services:
my_mailer:
    class: Path/To/GenericClass
    calls:
         - [anotherMethodName, [doctrine.orm.entity_manager]]

因此,该服务现在可以通过您的其他方法使用。

public function anotherMethodName($entityManager)
{
    // your magic
}

Ondrej 的答案是绝对正确的,我只是想将这块拼图添加到这个线程中。