ユーザーがエンティティに加えた変更を追跡するために、Gedmo Loggable を使用しています。デフォルトでは、ユーザー名は変更ごとに保存されませんが、リスナーに提供する必要があります。
この例は、Loggable のドキュメントにあります。
$loggableListener = new Gedmo\Loggable\LoggableListener;
$loggableListener->setAnnotationReader($cachedAnnotationReader);
$loggableListener->setUsername('admin');
$evm->addEventSubscriber($loggableListener);
これは、次の 2 つの理由でうまくいきません。
- コントローラーではなく、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() にパラメーターを渡すにはどうすればよいですか?