使用Symfony的DI时,如何动态配置对象?

时间:2013-09-30 13:02:42

标签: symfony dependency-injection

我正在使用YAML配置来连接我的依赖项,我需要提供一些运行时信息来获取有用的对象。一旦注入了对象,我就会从我的代码中运行一个setter方法,但我想知道是否有更好的方法(或者如果有一些我缺少的东西)。

这是我配置的要点:

services:
    example_object : "myObject"
        arguments : ["%object_parameter1%"] 
parameters:
    object_parameter1 : Some Static Data
    object_parameter2 : #Rutime info required

2 个答案:

答案 0 :(得分:1)

要检索任何服务中的当前登录用户,请注入security.context。在这种情况下,我使用setter注入来简化用户模拟注入。

namespace Acme\ExampleBundle\Foo;
use Symfony\Component\Security\Core\SecurityContextInterface;

class MyService
{
    private $param;
    private $user;

    public function __construct($param)
    {
        $this->param = $param;
    }

    /**
     * Retrieve the current logged in user from the security context.
     */
    public function setUserFromContext(SecurityContextInterface $context)
    {
        $this->user = $context->getToken()->getUser();
    }

    /**
     * Set any user object.
     *
     * Usefull for testing, to inject a simple user mock.
     */
    public function setUser($user)
    {
        $this->user = $user;
    }

    public function doSomething()
    {
        // do something with the user object
    }
}

定义服务:

services:
    my_service:
        class: Acme\ExampleBundle\Foo\MyService
        arguments: ["%object_parameter1%"]
        calls:
            - [ setUserFromContext, [@security.context] ]

答案 1 :(得分:1)

您不应尝试将动态值直接添加到DI配置中。 Symfony服务配置由编译的DI容器反映,重新编译操作非常繁重。

如果您不想直接将服务与Symfony的安全系统相结合,则可以将自定义“用户提供商”服务添加为依赖项。然后,如果信息源发生变化,您将需要重写此服务。它也可能很容易被嘲笑。

您还可以使用工厂注入用户对象而不是用户提供程序服务。