Symfony 4.2-服务/自动装配-基于控制器值的方法调用

时间:2019-01-11 21:10:06

标签: symfony

在Symfony 4.2中,不赞成使用Controller类,并且您应该切换到AbstractController,因此,除了为您定义的一些服务之外,不再有权使用$this->get('service.name')功能

我的基本控制器扩展了Symfony的Controller,并具有利用$this->get功能的功能:

public function getRepository($repository){
    $repo = $this->get($repository);
    if($this->authRepository !== null) {
        $repo->setPrefix($this->authRepository);
    }
    return $repo;
}

因此,在控制器中,我可以说类似$this->getRepository('api.service');之类的内容,然后它将加载我的服务,根据请求设置前缀,然后返回已配置的api.service。

借助新的AbstractController和服务的自动装配/自动注入功能,我如何才能告诉服务不仅调用setPrefix方法(我知道我可以做到),还可以告诉它在控制器中使用参数? / p> 到目前为止的配置:

api.service:
    class: App\ApiService
    calls:
        - method: setPrefix
          arguments:
              - '??????'

1 个答案:

答案 0 :(得分:0)

因此,您在上面发布的这种方法:

public function getRepository($repository){
    $repo = $this->get($repository);
    if($this->authRepository !== null) {
        $repo->setPrefix($this->authRepository);
    }
    return $repo;
}

可以使用新的DependecyInjection这样实现:

class TestController extends AbstractController
{
    /**
     * @Route("/test", name="test")
     */
    public function test(App\ApiService $service)
    {
        $service->maybeSetPrefix($service);
        $service->call(...
    }

    // this can go into your own BaseController
    public function maybeSetPrefix($service)
    {
        if ($this->authRepository !== null) {
            $service->setPrefix($this->authRepository);
        }
    }
}

您将不需要,因为Symfony DependencyInjection应该已经自动连接了它,但是手动将其看起来像这样:

App\ApiService:
    autowire: true
    autoconfigure: true
    public: false

因此,我们现在不再使用api.service之类的服务ID,而是完全合格的类名App\ApiService

如果您仍然希望通过api.service使服务可引用,则可以另外添加别名服务定义:

api.service:
    alias: App\ApiService
    public: true

但是也许在您的情况下,您可以让App\ApiService根据请求而不是由控制器来决定如何初始化自身,就像这样:

class ApiService
{
    public function __construct(RequestStack $requestStack, AuthRepository $authRepository)
    {
        $request = $requestStack->getCurrentRequest();

        if ($request->get('option') === 'test') {
            $this->setPrefix($authRepository);
        }
    }

如果这样做没有帮助,请发布一些更多详细信息或当前Controller逻辑的示例代码。