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

标签 symfony symfony4

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

Argument 1 passed to App\EventListener\KernelRequestListener::__construct() must be an instance of Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage, instance of Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage given, called in C:\xampp\htdocs\chat-project-symfony\var\cache\dev\Container06Mjwya\srcApp_KernelDevDebugContainer.php on line 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;
        //..
    }
}

这是我的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
我已经尝试清除缓存文件夹并删除缓存文件夹,但它没有改变。

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

谢谢

最佳答案

I don't know why symfony tell me that I'm using Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage while it's clearing written 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;
        //..
    }
}

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

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

关于Symfony 升级给我从 4.1 到 4.4 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59058921/

相关文章:

php - 如何使用 Doctrine ORM 在 Symfony 中设置初始数据(不是测试数据)

symfony - 如何转发请求到路线名称

php - Symfony 生产映射异常 FOSUserBundle

css - 在同一行对齐表单输入

email - Symfony 信使 : Send logged messenger errors per email (via swift_mailer)?

php - Symfony 路由组件不路由 url

php - 在 Symfony v4.2 中将带有数据的数组传递给 ChoiceType (html select)

php - Symfony 5 - 在 Trait 中返回当前用户数据不起作用

php - 如何在 twig 中显示来自 Unix 时间戳的格式化日期?

symfony - 如何告诉 Symfony2 不要使用 https?