[英]Symfony - Get security.token_storage in Sylius repositories
I have tried to inject security.token_storage
service via CompilerPass
, I do not have errors and user is currently logged, however when I access the TokenStorage, $tokenStorage->getToken()
I got a null response.我尝试通过
CompilerPass
注入security.token_storage
服务,我没有错误并且用户当前已记录,但是当我访问 TokenStorage 时, $tokenStorage->getToken()
我得到了一个空响应。
I checked these links to reference, but I cannot achieve to get a valid token.我检查了这些链接以供参考,但我无法获得有效的令牌。
How to inject shared service from compiler pass in Symfony and Access currently logged in user in UserRepository in Sylius 如何从 Symfony 中的编译器传递和访问当前登录用户在 Sylius 的 UserRepository 中注入共享服务
Do you an idea why it returns null response?你知道为什么它返回空响应吗?
Bundle class:捆绑类:
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ModifyRepositoryPass());
}
ModifyRepositoryPass class: ModifyRepositoryPass 类:
class ModifyRepositoryPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container
->getDefinition('sylius.repository.order')
->addMethodCall('getTokenStorage', array(
new Reference('security.token_storage')
));
}
}
Get token:获取令牌:
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
}
Config.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()"]
My guess is because tokenstorage is not populated at the compilerpass execution moment.我的猜测是因为在编译器传递执行时刻没有填充令牌存储。 Do you have another oportunity to handle it on another time period, for example built-in kernel event
kernel.request
?您是否有其他机会在另一个时间段处理它,例如内置内核事件
kernel.request
?
By the way, did tried just to inject \\Sylius\\Bundle\\CoreBundle\\Context\\CustomerContext
service into repository, without compilerpass?顺便说一句,是否尝试过将
\\Sylius\\Bundle\\CoreBundle\\Context\\CustomerContext
服务注入存储库,而没有编译器通过?
For some reason, I could not inject to repository construct function or use setter injection as we know it.出于某种原因,我无法注入存储库构造函数或使用我们所知道的 setter 注入。
I tried several ways to retrieve user session and my last resort was overwrite the grid sylius_admin_order
and use an expression: expr:service('security.token_storage').getToken()
我尝试了几种方法来检索用户会话,最后的手段是覆盖网格
sylius_admin_order
并使用表达式: expr:service('security.token_storage').getToken()
AdminBundle/Resources/config/grids/order.yml
overwrite: vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/Resources/config/grids/order.yml
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.