2013-06-11 25 views
4

当我创建一个线程时,如何设置消息由线程的创建者读取?Symfony2中的FOSMessageBundle

我的代码

$composer = $this->get('fos_message.composer'); 
    $message = $composer->newThread() 
     ->setSender($this->getUser()) 
     ->setSubject('myThread') 
     ->setBody($request->get('createThread')['my_thread']); 

    $sender = $this->get('fos_message.sender'); 
    $sender->send($message); 

该部分但是,当我在最后一行发送消息,在数据库is_read的值被设置为0,当发送者应设置为1。所以,当他发送消息时,我需要将作者设置为阅读。

有人吗? :)

+0

什么实体的propertie是'is_read'? – cheesemacfly

+0

是message_metadata,但我无法直接从消息中设置它,但有一种方法用于$ message-> setIsreadbyParticipant,但此方法在数据库中搜索元数据,然后进行设置。我想在实体持续之前设置它。 – Nico

回答

6

消息元数据不存在,直到消息持续。这就是为什么你必须设置读取状态保存消息到数据库。

最简单的方法是注册EventSubscriber。 工作示例代码:

<?php 
namespace Acme\DemoBundle\EventListener; 

use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use FOS\MessageBundle\Event\MessageEvent; 
use FOS\MessageBundle\Event\FOSMessageEvents as Event; 
use FOS\MessageBundle\ModelManager\MessageManagerInterface; 

class MessageSendSubscriber implements EventSubscriberInterface 
{ 
    private $messageManager; 

    public function __construct(MessageManagerInterface $messageManager) 
    { 
     $this->messageManager = $messageManager; 
    } 

    public static function getSubscribedEvents() 
    { 
     return array(
      Event::POST_SEND => 'markAsReadBySender' 
     ); 
    } 

    public function markAsReadBySender(MessageEvent $event) 
    { 
     $message = $event->getMessage(); 
     $sender = $message->getSender(); 

     $this->messageManager->markAsReadByParticipant($message, $sender); 
     $this->messageManager->saveMessage($message); 
    } 
} 

在services.yml:

message_send_listener: 
    class: Acme\DemoBundle\EventListener\MessageSendSubscriber 
    arguments: [@fos_message.message_manager] 
    tags: 
     - { name: kernel.event_subscriber } 

在这里,您可以检查您可以订阅哪些事件: https://github.com/FriendsOfSymfony/FOSMessageBundle/blob/master/Event/FOSMessageEvents.php

+0

作品完美无瑕!谢谢! – Nico