php - Symfony - 在 Sylius 存储库中获取 security.token_storage
问题描述
我试图通过 注入security.token_storage
服务CompilerPass
,我没有错误并且用户当前已登录,但是当我访问 TokenStorage 时,$tokenStorage->getToken()
我得到了一个空响应。
我检查了这些链接以供参考,但我无法获得有效的令牌。
如何从 Symfony 中的编译器传递注入共享服务和访问当前登录的用户在 Sylius 的 UserRepository 中
你知道为什么它返回空响应吗?
- Sylius 版本:1.4 和 Symfony 4.4
捆绑类:
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ModifyRepositoryPass());
}
ModifyRepositoryPass 类:
class ModifyRepositoryPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container
->getDefinition('sylius.repository.order')
->addMethodCall('getTokenStorage', array(
new Reference('security.token_storage')
));
}
}
获取令牌:
class OrderRepository extends BaseOrderRepository
{
/** @var TokenStorageInterface */
protected $tokenStorage;
public function getTokenStorage(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public function createListFilter()
{
$token = $this->tokenStorage->getToken()); // NULL token
}
配置.yml
sylius_order:
resources:
order:
classes:
repository: AppBundle\Repository\OrderRepository
#method: getTokenStorage also, I tried inject expression, but it does not work
#arguments: ["tokenStorage", "expr:service('security.token_storage').getToken()"]
解决方案
出于某种原因,我无法注入到存储库构造函数或使用我们所知道的 setter 注入。
我尝试了几种方法来检索用户会话,我最后的手段是覆盖网格sylius_admin_order
并使用表达式: expr:service('security.token_storage').getToken()
AdminBundle/Resources/config/grids/order.yml
覆盖:vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/Resources/config/grids/order.yml
sylius_grid:
grids:
sylius_admin_order:
driver:
name: doctrine/orm
options:
class: "%sylius.model.order.class%"
repository:
method: createListQueryBuilder
arguments:
usernamePasswordToken: "expr:service('security.token_storage').getToken()"
.......
- 订单仓库:
class OrderRepository extends BaseOrderRepository
{
/**
* @param UsernamePasswordToken|null $usernamePasswordToken
* @return QueryBuilder
*/
public function createListQueryBuilder($usernamePasswordToken = null): QueryBuilder
{
$user = $usernamePasswordToken->getUser();
推荐阅读
- python - Python 保存 3100 万行 80 列的数据框
- go - gRPC:基于每个 RPC 对 API 进行速率限制
- reactjs - 无法为范围注册 ServiceWorker - 脚本具有不受支持的 MIME 类型 ('text/html')
- javascript - 如何全局自定义错误消息 vee-validate
- android - 如何更改为 Android Studio 添加 java 类的设置
- php - 在 PHP 中计算可用时隙
- angular - 查询参数和 url 未正确更新
- c++ - char* 缓冲区的 C++ 大小
- ios - 使用 iOS 如何从网站获取 JSON 并按原样保存?
- amazon-ec2 - ARM 处理器的随机重启问题