Symfony 3.4:RecursiveValidator还是TraceableValidator?

Sky*_*kyd 3 php symfony

我的服务有问题.

 <service id="api.api" class="ApiBundle\Service\ApiService">
        <argument type="service" id="request_stack"/>
        <argument type="service" id="validator"/>
 </service>
Run Code Online (Sandbox Code Playgroud)

__construct是:

public function __construct(RequestStack $requestStack, RecursiveValidator  $validator)
{
    $this->request = $requestStack->getCurrentRequest();
    $this->validator = $validator;
}
Run Code Online (Sandbox Code Playgroud)

问题是:

  • ENV_DEV,验证器必须是TraceableValidator的一个实例
  • ENV_PROD,验证器必须是RecursiveValidator的一个实例

你知道我为什么会有这场冲突吗?

在带有RecursiveValidator的ENV_DEV中,我有这个错误:

Type error: Argument 2 passed to 
ApiBundle\Service\ApiService::__construct() must be an instance of 
Symfony\Component\Validator\Validator\RecursiveValidator, 
instance of Symfony\Component\Validator\Validator\TraceableValidator 
given, called in 
var/cache/dev/ContainerLqjid6c/getApi_ApiService.php on line 8
Run Code Online (Sandbox Code Playgroud)

cache:clear 没有解决问题.

谢谢您的帮助.

lxg*_*lxg 8

您应始终(如果可用)提示接口,而不是暗示实现.在这种情况下,无论是RecursiveValidatorTraceableValidator落实ValidatorInterface.

所以你的构造函数应该是这样的:

public function __construct(RequestStack $requestStack, ValidatorInterface  $validator)
{
    $this->request = $requestStack->getCurrentRequest();
    $this->validator = $validator;
}
Run Code Online (Sandbox Code Playgroud)