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

时间:2015-12-16 12:23:02

标签: php symfony dependency-injection

我有一个Symfony2应用程序(第三方API的桥梁),主要由控​​制台命令组成。每个控制台命令都使用“organizationId”参数,该参数用于解析API的各种选项,例如API密钥,URL,可用语言等。应用程序中90%的服务使用这些参数来调用API或获取/将数据存储在本地数据库中。

我使用Symfony DI构建服务,每个服务都有公共方法setOrganization(Organization $organization),在获取服务后调用它。例如。 (简化代码):

protected function execute(InputInterface $input, OutputInterface $output)
{
    $organization = $this
        ->getContainer()
        ->get('doctrine')
        ->getRepository('CoreBundle:Organization')
        ->find($input->getArgument('organizationId'));

    $personService = $this->getContainer()
        ->get('person')
        ->setOrganization($organization); // I want to get rid of this
    $personService->doStuff();
}

服务定义:

person:
    class: AppBundle\Services\Person
    arguments: ["@buzz", "@doctrine.orm.entity_manager", "@organization_settings_resolver", "%media_service%"]

我正在寻找一种重构代码的方法,这样我每次使用任何服务时都不需要调用setOrganization()。是否可以将对象或命令行参数传递给构造函数而不传递整个服务容器? 也许应该采用不同的方法,例如类似security.token_storage层的东西,它会以“会话信息”的形式存储,但是以控制台的方式存储? 什么是最好的架构和Symfony方式解决方案?

2 个答案:

答案 0 :(得分:3)

在服务定义中,您可以在初始化中调用服务的方法,因此您可以在获取后调用它:

person:
    class: AppBundle\Services\Person
    arguments: ["@buzz", "@doctrine.orm.entity_manager", "@organization_settings_resolver", "%media_service%"]
    calls:
        - [ setOrganization,[ @your_organization ] ]

如果your_organisation是定义且可用的服务

答案 1 :(得分:0)

您可以将组织作为->doStuff()方法的参数吗?

这样,您就不需要再调用setOrganisation,并且无需首先设置组织就可以调用doStuff。