4

ユーザーがエンティティに加えた変更を追跡するために、Gedmo Loggable を使用しています。デフォルトでは、ユーザー名は変更ごとに保存されませんが、リスナーに提供する必要があります。

この例は、Loggable のドキュメントにあります。

  $loggableListener = new Gedmo\Loggable\LoggableListener;
  $loggableListener->setAnnotationReader($cachedAnnotationReader);
  $loggableListener->setUsername('admin');
  $evm->addEventSubscriber($loggableListener);

これは、次の 2 つの理由でうまくいきません。

  1. コントローラーではなく、services.yml にリスナーを登録しています
  2. 例のように既知のユーザー名を保存するのではなく、ログインしているユーザーのユーザー名を保存したい

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() にパラメーターを渡すにはどうすればよいですか?

4

3 に答える 3