在创建线程时,如何设置线程的创建者读取消息?
我有这部分代码
$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);但是当我在最后一行发送消息时,在数据库中,当发送方应设置为1时,is_read的值设置为0.因此,我需要设置作者在发送消息时被读取。
任何人? :)
How do i set, when i create a thread, that the message is read by the creator of the thread?
I have this portion of code
$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);But when i send the message in the last line, in the database the value of is_read is set to 0, when the sender should be set to 1. So, i need to set the author to is read when he send the message.
Anyone? :)
最满意答案
在消息持久化之前,消息元数据不存在。 这就是为什么在将消息保存到数据库后必须设置读取状态的原因。
最简单的方法是注册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
Message metadata doesn't exist until message is persisted. That's why you have to set read status after saving message to database.
The easiest way to do this is registering EventSubscriber. Working example code:
<?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); } }In services.yml:
message_send_listener: class: Acme\DemoBundle\EventListener\MessageSendSubscriber arguments: [@fos_message.message_manager] tags: - { name: kernel.event_subscriber }Here you can check what events you can subscribe to: https://github.com/FriendsOfSymfony/FOSMessageBundle/blob/master/Event/FOSMessageEvents.php
更多推荐
发布评论