Symfony升级给我错误从4.1到4.4

时间:2019-11-26 20:31:07

标签: symfony symfony4

我刚刚从symfony 4.1迁移到4.4 我有这个错误:

  

传递给App \ EventListener \ KernelRequestListener :: __ construct()的参数1必须是Symfony \ Component \ Security \ Core \ Authentication \ Token \ Storage \ TokenStorage的实例,Symfony \ Component \ Security \ Core \ Authentication \的实例给定了Token \ Storage \ UsageTrackingTokenStorage,在C:\ xampp \ htdocs \ chat-project-symfony \ var \ cache \ dev \ Container06Mjwya \ srcApp_KernelDevDebugContainer.php中调用

当您看我的KernelRequestListener时:

<?php

namespace App\EventListener;

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
//..

class KernelRequestListener
{
    private $tokenStorage;

    /**
     * KernelRequestListener constructor.
     * @param TokenStorage $tokenStorage
     * ...
     */
    public function __construct(TokenStorage $tokenStorage/*...*/)
    {
        $this->tokenStorage = $tokenStorage;
        //..
    }
}

这是我的config/services.yaml文件:

#...
services:
  #..
  App\EventListener\KernelRequestListener:
    arguments: [ '@security.token_storage' ]
    tags:
      - { name: kernel.event_listener, event: kernel.request }
      - { name: kernel.event_listener, event: kernel.response }

我不知道为什么symfony会告诉我我正在使用Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage清除Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage

我已经尝试清除缓存文件夹并删除缓存文件夹,并且它没有变化。

我该如何解决?

谢谢

2 个答案:

答案 0 :(得分:2)

  

我不知道为什么symfony会告诉我我正在使用Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage清除Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage

它不是symfony,而是PHP的类型检查功能。您要说明您的侦听器需要一个TokenStorage,但是symfony传递给它的是不同的类,因此是错误。

因此,正如@JaredFarrish指出的那样,您应该在构造函数中使用TokenStorageInterface,如下所示:


namespace App\EventListener;

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
//..

class KernelRequestListener
{
    private $tokenStorage;

    /**
     * KernelRequestListener constructor.
     * @param TokenStorageInterface $tokenStorage
     * ...
     */
    public function __construct(TokenStorageInterface $tokenStorage/*...*/)
    {
        $this->tokenStorage = $tokenStorage;
        //..
    }
}

在存在接口的情况下使用接口是一种常见的做法,因为这样一来,您就可以与其他类松耦合,并提供对单元进行单元测试的方法。

看看:https://github.com/symfony/security-bundle/blob/master/Resources/config/security.xml#L22由于弃用,他们将类切换为@security.token_storage服务。但是,当您使用接口时,您根本不在乎任何底层的东西,只是知道由于接口协定,您将拥有自己的方法。

答案 1 :(得分:1)

我通过更改此行对其进行了修复:

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;

有了这个:

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface as TokenStorage;