我刚刚从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
我已经尝试清除缓存文件夹并删除缓存文件夹,并且它没有变化。
我该如何解决?
谢谢
答案 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;