Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Message Bundle Laravel Package

friendsofsymfony/message-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require friendsofsymfony/message-bundle
    

    Add to config/bundles.php:

    return [
        // ...
        FriendsOfSymfony\MessageBundle\FOSMessageBundle::class => ['all' => true],
    ];
    
  2. Database Migration: Run migrations for Doctrine ORM (or ODM if using MongoDB):

    php bin/console doctrine:migrations:diff
    php bin/console doctrine:migrations:migrate
    
  3. First Use Case: Send a message between users via a controller:

    use FriendsOfSymfony\MessageBundle\Model\MessageInterface;
    use FriendsOfSymfony\MessageBundle\Manager\MessageManagerInterface;
    
    public function sendMessage(MessageManagerInterface $messageManager, $recipientId, Request $request)
    {
        $message = $messageManager->createMessage();
        $message->setSender($this->getUser());
        $message->setRecipientId($recipientId);
        $message->setSubject($request->request->get('subject'));
        $message->setBody($request->request->get('body'));
    
        $messageManager->saveMessage($message);
        return new Response('Message sent!');
    }
    
  4. Routing: Enable routing by importing fos_message routes in config/routes.yaml:

    fos_message:
        resource: "@FOSMessageBundle/Resources/config/routing.yml"
        prefix: /messages
    

Implementation Patterns

Core Workflows

  1. Message Creation & Management:

    • Use MessageManagerInterface to create, read, update, and delete messages.
    • Example: Threaded conversations via ThreadManagerInterface:
      $thread = $threadManager->findThreadById($threadId);
      $message = $messageManager->createMessage();
      $message->setThread($thread);
      $message->setSender($this->getUser());
      $message->setBody($request->get('content'));
      $messageManager->saveMessage($message);
      
  2. Permissions & Security:

    • Leverage the built-in permission system to restrict access:
      # config/packages/security.yaml
      access_control:
          - { path: ^/messages, roles: ROLE_USER }
      
    • Customize permissions via fos_message.permissions config (e.g., disable spam detection):
      fos_message:
          permissions:
              spam_detection: false
      
  3. Templates & Notifications:

    • Override default Twig templates in templates/FOSMessageBundle/ to customize UI.
    • Extend notification logic via event listeners (e.g., send email on new message):
      // src/EventListener/NewMessageListener.php
      public function onNewMessage(NewMessageEvent $event)
      {
          $message = $event->getMessage();
          // Send email or trigger other logic
      }
      
      Register in services.yaml:
      services:
          App\EventListener\NewMessageListener:
              tags:
                  - { name: kernel.event_listener, event: fos_message.new_message, method: onNewMessage }
      
  4. Soft Deletion:

    • Use MessageManagerInterface::deleteMessage() for soft deletion (messages are marked as deleted but retained for auditing).
    • Filter deleted messages in queries:
      $messages = $messageManager->getMessageRepository()->findBy(
          ['deletedAt' => null],
          ['createdAt' => 'DESC']
      );
      
  5. API Integration:

    • Expose endpoints for SPAs or mobile apps:
      # config/routes/api.yaml
      fos_message_api:
          resource: "@FOSMessageBundle/Resources/config/routing/api.yml"
          prefix: /api/messages
      
    • Serialize responses with API Platform or custom serializers.

Integration Tips

  • Doctrine Events: Latch onto fos_message.message.pre_persist or fos_message.message.post_remove for pre/post-processing:

    services:
        App\EventListener\MessageEventListener:
            tags:
                - { name: kernel.event_listener, event: fos_message.message.pre_persist, method: onPrePersist }
    
  • Testing: Use MessageManagerInterface in tests to mock message creation:

    $messageManager = $this->createMock(MessageManagerInterface::class);
    $messageManager->method('createMessage')->willReturn($message);
    
  • Custom Fields: Extend the Message entity to add metadata (e.g., isUrgent):

    // src/Entity/Message.php
    class Message extends AbstractMessage
    {
        private $isUrgent = false;
    
        // Getters/setters
    }
    

    Update the form type and templates accordingly.


Gotchas and Tips

Pitfalls

  1. Deprecation:

    • The bundle is not actively maintained (last release: 2019). Ensure compatibility with Symfony 5.4+/6.x by checking for forks or alternatives like API Platform’s Messenger.
    • For Symfony <3.4, use v1.3.0 (see legacy docs).
  2. Threading Quirks:

    • Threads are automatically created when the first message is sent between users. Avoid manual thread creation unless extending functionality.
    • Soft-deleted messages persist in threads until explicitly purged (e.g., via a cron job).
  3. Permission Overrides:

    • Custom permission logic may conflict with the bundle’s defaults. Override via:
      fos_message:
          permissions:
              can_send_message: ['ROLE_USER', 'ROLE_ADMIN']
      
  4. Spam Detection:

    • The spam filter uses a simple keyword-based system. For advanced detection, replace the FOS\MessageBundle\Spam\SpamDetector service:
      services:
          fos_message.spam_detector:
              class: App\Spam\CustomSpamDetector
              arguments: ['@fos_message.manager']
      
  5. ORM vs. ODM:

    • Doctrine ORM is the primary focus. ODM (MongoDB) support is secondary and may lag in features. Test thoroughly if using MongoDB.

Debugging

  1. Message Not Saving:

    • Check for validation errors:
      $errors = $messageManager->getMessageValidator()->validate($message);
      
    • Verify the sender and recipientId are set (required fields).
  2. Threading Issues:

    • Ensure ThreadManagerInterface is injected correctly. Threads are auto-linked to messages via setThread() or setRecipient().
  3. Permission Denied:

    • Clear cache after modifying fos_message.permissions:
      php bin/console cache:clear
      
    • Check Symfony’s profiler (/profiler) for access control logs.
  4. Soft Deletion Not Working:

    • Confirm deletedAt is null for active messages. Use:
      $message->setDeletedAt(new \DateTime()); // Hard delete
      $message->setDeletedAt(null); // Restore
      

Extension Points

  1. Custom Message Types:

    • Extend AbstractMessage to add fields (e.g., FileMessage):
      class FileMessage extends AbstractMessage
      {
          private $file;
      
          // Add getters/setters and validation
      }
      
    • Register the new type in MessageManager:
      services:
          App\Message\FileMessage:
              tags: ['fos_message.message_type']
      
  2. Event-Driven Extensions:

    • Listen for fos_message.thread.created to trigger side effects (e.g., analytics):
      public function onThreadCreated(ThreadEvent $event)
      {
          $thread = $event->getThread();
          // Custom logic
      }
      
  3. API Resources:

    • Use API Platform to auto-generate endpoints:
      # config/api/resources.yaml
      resources:
          App\Entity\Message:
              collectionOperations:
                  get: false
                  post: false
              itemOperations:
                  get:
                      method: GET
                      path: /messages/{id}
      
  4. Testing Helpers:

    • Create a test utility to bootstrap messages:
      // tests/Utils/MessageTestHelper.php
      class MessageTestHelper
      {
          public static function createTestMessage(MessageManagerInterface $manager, User $sender, User $recipient)
          {
              $message = $manager->createMessage();
              $message->setSender($sender);
              $message->setRecipientId($recipient->getId());
              $message->setBody('Test message');
              $manager->saveMessage($message);
              return $message;
          }
      }
      

Pro Tips

  • Performance:
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
comsave/common
alecsammon/php-raml-parser
chrome-php/wrench
lendable/composer-license-checker
typhoon/reflection
mesilov/moneyphp-percentage
mike42/gfx-php
bookdown/themes
aura/view
aura/html
aura/cli
povils/phpmnd
nayjest/manipulator
omnipay/tests
psr-mock/http-message-implementation
psr-mock/http-factory-implementation
psr-mock/http-client-implementation
voku/email-check
voku/urlify
rtheunissen/guzzle-log-middleware