Symfony 升级给我从 4.1 到 4.4 的错误

Ale*_*122 4 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 中调用,第 1130 行

而如果你看看我的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;
        //..
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的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 }
Run Code Online (Sandbox Code Playgroud)

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

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

我怎样才能解决这个问题 ?

谢谢

spi*_*rit 6

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

这不是symfonybutPHP的类型检查功能。您是在声明您的 Listener 想要一个TokenStoragesymfony正在传递给它不同的类,因此错误。

因此,正如@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;
        //..
    }
}
Run Code Online (Sandbox Code Playgroud)

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

看一看:https : //github.com/symfony/security-bundle/blob/master/Resources/config/security.xml#L22@security.token_storage由于弃用,他们切换了服务类。但是当你使用一个接口时,你并不关心任何底层的东西,你只知道你会因为接口契约而拥有你的方法。

  • 请注意,还有 Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface - 在 IDE 中选择类时容易犯的错误 (4认同)