Symfony 3.4 中的依赖注入:检查服务是否存在

Dependency injection in Symfony 3.4 : check existence of a service

我正在将应用程序从 Symfony 2.8 迁移到 Symfony 3.4

服务现在是私有的,因此我们必须使用依赖注入作为解决方法,而不是直接从容器调用服务。

所以这是以下脚本,我想检查是否存在,然后使用依赖注入调用 profiler 服务:

<?php

namespace DEL\Bundle\ApiBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Class EstimatePDFController
 *
 * @package DEL\Bundle\ApiBundle\Controller
 */
class EstimateController extends Controller
{
    /**
     *
     * @param Request $request Request object.
     *
     * @return Response A Response instance
     */
    public function sendAction(Request $request)
    {
        // disable debug env outputs
        if ($this->container->has('profiler')) {
            $this->container->get('profiler')->disable();
        }

        return new Response('OK');
    }
}

据我所知,使用自动装配是不可能的。但是 documentation 提供了另一种选择:

  • profiler 作为 属性
  • 添加到您的控制器
  • 添加一个 setter 类似 setProfiler(Profiler $profiler) 设置 属性
  • 向您的服务定义添加条件 setter:
    calls:
       - [setProfiler, ['@?profiler']]
    
  • 在您的 sendAction 方法中检查 $this->profiler 是否为 null

检查是否存在意味着 Profiler 在使用之前就已经存在,对吗?因此,您可以使用默认值自动装配探查器,如果它不为空,则它存在。像这样:

/**
 * @param Request  $request  Request object.
 * @param Profiler $profiler The Profiler if the service exists 
 *
 * @return Response A Response instance
 */
public function sendAction(Request $request, Profiler $profiler = null): Response
{
    // disable debug env outputs
    if ($profiler !== null) {
        $profiler->disable();
    }

    return new Response('OK');
}

顺便说一句,这是默认行为。它尝试解决参数,但如果失败,则跳过它。如果您没有默认值,则 PHP 失败。