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

Tek*_*Tek 12 symfony

我在Symfony2中有一个服务,看起来像:

services:
    MyCustomService:
        class:     MyClass
        arguments: //Arguments aren't static, but dynamic based on application logic.
Run Code Online (Sandbox Code Playgroud)

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

在控制器中似乎没有任何额外的参数 $this->get('MyCustomService');

有什么我想念的吗?

tom*_*lin 9

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

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

你会使用这样的东西:

$this->get('MyCustomService')->setSomething($something);
Run Code Online (Sandbox Code Playgroud)

  • 我一直在寻找几天,我找不到真正告诉我服务真正含义的任何地方.令人难以置信的是令人沮丧.所有文档都告诉我,它是使用服务容器的东西,然后是如何编写一个.我在哪里可以找到他们最适合的解释,一切似乎都是'嘿服务是的,他们很酷这里是如何制作一个' (2认同)

Cy *_*y K 6

无论出于何种原因,如果在实例化后无法配置服务(例如,使用配置程序).将责任委托给工厂怎么样?它将允许您使用"动态参数"实例化服务.

services:
    MyCustomServiceFactory:
        class: MyClassFactory
        arguments: [ @dynamicService, %time_prefix% ]
    MyCustomService:
        class:              MyClass
        factory_service:    MyCustomServiceFactory
        factory_method:     get
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我也很好奇这是怎么称呼的.你如何动态传递%time_prefix%?这仍然是需要在yaml文件中定义的参数 (3认同)