将动态变量传递给服务构造函数

时间:2014-05-22 15:58:51

标签: symfony

我在Symfony2中有一个服务,如下所示:

services:
    MyCustomService:
        class:     MyClass
        arguments: //Arguments aren't static, but dynamic based on application logic.

是否可以将动态变量传递给服务的构造函数?

控制器的$this->get('MyCustomService');

中似乎没有任何额外的参数

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:9)

对我而言,听起来,你不明白“服务”这个词到底意味着什么。你想要实现的目标不再是服务了。

你仍然可以在“MyClass”中为任何自定义参数定义一个setter方法,同时定义一些默认值,当你使用setter方法时,你基本上会覆盖它们。

您可以使用以下内容:

$this->get('MyCustomService')->setSomething($something);

答案 1 :(得分:6)

如果出于某种原因,您无法在实例化后配置服务(即with a configurator)。委派责任to a factory怎么样?它将允许您使用"动态参数"。

实例化服务
services:
    MyCustomServiceFactory:
        class: MyClassFactory
        arguments: [ @dynamicService, %time_prefix% ]
    MyCustomService:
        class:              MyClass
        factory_service:    MyCustomServiceFactory
        factory_method:     get

你的工厂想要这样的东西:

class MyClassFactory
{
    private $dynamicService;
    private $timePrefix;

    public function __construct(MyDynamicService $dynamicService, $timePrefix)
    {
        $this->dynamicService = $dynamicService;
        $this->timePrefix = $timePrefix;

    }

    public function get()
    {
        // Dynamic arguments based on application logic.
        $dynamicArg1 = $this->dynamicService->getArg()
        $dynamicArg2 = $this->timePrefix . time();

        return new MyClass($dynamicArg1, $dynamicArg2);
    }
}