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 失败。
我正在将应用程序从 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 失败。