2

ユーザーが生成されたときのようなカスタムイベントを作成し、イベントディスパッチャーがそのイベントを発生させます。

私はこのチュートリアルに従っています。class CommentListenerデータベースにいくつかのものを保持したいので、エンティティマネージャーにアクセスする方法を知りたいです。

クラスは次のようになります。

class CommentListener
{
    protected $mailer;

    public function __construct(Swift_Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function onCommentEvent(CommentEvent $event)
    {
        $post = $event->getPost();
        $comment = $event->getComment();

        foreach ($post->getSubscribers() as $subscriber) {
            $message = Swift_Message::newInstance()
                ->setSubject('New comment posted on ' . $post->getTitle())
                ->setFrom('send@example.com')
                ->setTo($subscriber->getEmail())
                ->setBody("Hey, somebody left a new comment on a post you're subscribed to! It says: " . $comment->getBody())
            ;
            $this->mailer->send($message);
        }
    }
}

では、どのようにしてエンティティマネージャーにアクセスできますonCommentEventか?

4

1 に答える 1

8

リスナーは通常のサービスです。と一緒にコンストラクターに挿入するだけmailerです。これらの行に沿ったもの:

サービス:

services:
    foo_bundle.listener.comment:
        class: FooVendorBarBundleEventListenerCommentListener
        arguments:
            mailer: "@mailer"
            entityManager: "@doctrine.orm.entity_manager"
        tags:
            - { name: kernel.event_listener, event: foo_bundle.post.comment_added, method: onCommentEvent }

リスナー クラス:

class CommentListener
{
    protected $mailer;

    protected $entityManager;

    public function __construct(Swift_Mailer $mailer, $entityManager)
    {
        $this->mailer = $mailer;
        $this->entityManager = $entityManager;
    }

...

特定のサービス run の名前を見つける必要がある場合php app/console container:debug

于 2012-08-02T05:21:56.903 に答える