我正在使用 Gedmo Loggable 来跟踪用户对实体所做的更改。默认情况下不会为每次更改存储用户名,但有必要将其提供给侦听器。
这方面的一个例子,可以在 Loggable 的文档中找到:
$loggableListener = new Gedmo\Loggable\LoggableListener;
$loggableListener->setAnnotationReader($cachedAnnotationReader);
$loggableListener->setUsername('admin');
$evm->addEventSubscriber($loggableListener);
这对我不起作用,原因有两个:
- 我在 services.yml 中注册监听器,而不是在控制器中
- 我不希望像示例中那样存储预先知道的用户名,而是存储登录用户的用户名
loggableListener 的方法 setUsername 要么需要一个字符串,要么需要一个带有提供字符串的方法 getUsername 的对象。
我怎样才能将任何一个传递给听众?我找到了一种传递 security_token 的方法,但这还不够。我目前拥有的是这样的:
(...)
gedmo.listener.loggable:
class: Gedmo\Loggable\LoggableListener
tags:
- { name: doctrine.event_subscriber, connection: default }
calls:
- [ setAnnotationReader, [ "@annotation_reader" ] ]
#- [ setUsername, [ "A fixed value works" ] ]
- [ setUserValue, [ @security.??? ] ]
我也在使用 Blameable 并为类似问题找到了一个很好的解决方法(整个监听器被覆盖)。我尝试为 Loggable 做同样的事情,但这似乎有点复杂。
主要问题:如何将安全用户对象(或其用户名)传递给 services.yml 中的侦听器?
更新
Matteo 向我展示了如何将函数的结果作为参数传递给侦听器。这几乎解决了问题。还有另一个服务,它在给定 token_storage 时提供用户名。但这意味着我需要将参数传递给服务,该参数作为参数提供给另一个服务。这个例子将解释:
- [ setUsername, [ "@=service('gedmo.listener.blameable').getUsername( @security.token_storage )" ] ]
现在的问题是,@security.token_storage 在这种情况下不被接受。如何将参数传递给方法 getUsername() ?