Sylius12 min

Sylius Resource Bundle : comprendre le coeur de l'architecture

Par Pierre-Arthur Demengel
SyliusResource BundleSymfonyArchitecturePHP

Le Resource Bundle est le moteur invisible de Sylius. Il genere les CRUD, standardise les patterns et garantit la coherence de l'ensemble du framework. Comprendre son fonctionnement est essentiel pour personnaliser Sylius efficacement.

Le concept de Resource

Dans Sylius, une resource est une entite Doctrine enrichie avec :

  • Un repository pour les requetes
  • Une factory pour la creation d'instances
  • Un controller generique pour le CRUD
  • Un form type pour les formulaires
  • Des routes generees automatiquement

Declarer une resource

# config/packages/sylius_resource.yaml
sylius_resource:
  resources:
    app.faq_item:
      classes:
        model: App\Entity\FaqItem
        repository: App\Repository\FaqItemRepository
        factory: Sylius\Component\Resource\Factory\Factory
        form:
          default: App\Form\Type\FaqItemType

Cette declaration unique genere :

  • Un service app.repository.faq_item
  • Un service app.factory.faq_item
  • Un controller generique pret pour le CRUD

Routing automatique

# config/routes/faq.yaml
app_admin_faq_item:
  resource: |
    alias: app.faq_item
    section: admin
    templates: "@SyliusAdmin/Crud"
    redirect: index
    grid: app_admin_faq_item
    vars:
      all:
        subheader: app.ui.manage_faq
      index:
        icon: question circle
  type: sylius.resource

Cela genere automatiquement les routes :

  • GET /admin/faq-items/ (index)
  • GET /admin/faq-items/new (create form)
  • POST /admin/faq-items/ (create)
  • GET /admin/faq-items/{id}/edit (update form)
  • PUT /admin/faq-items/{id} (update)
  • DELETE /admin/faq-items/{id} (delete)

Le cycle de vie d'une resource

Quand un formulaire de creation est soumis :

  1. Le controller generique recoit la requete
  2. La factory cree une instance vierge de l'entite
  3. Le form type hydrate l'entite avec les donnees du formulaire
  4. Un event pre_create est dispatche (point d'extension)
  5. Le repository persiste l'entite via Doctrine
  6. Un event post_create est dispatche
  7. Le controller redirige vers la liste

Surcharger la factory

<?php
namespace App\Factory;

use Sylius\Component\Resource\Factory\FactoryInterface;

class FaqItemFactory implements FactoryInterface
{
    private FactoryInterface $decoratedFactory;

    public function __construct(FactoryInterface $decoratedFactory)
    {
        $this->decoratedFactory = $decoratedFactory;
    }

    public function createNew(): FaqItem
    {
        $item = $this->decoratedFactory->createNew();
        $item->setPosition(0);
        $item->setEnabled(true);
        return $item;
    }
}

Ecouter les events

<?php
namespace App\EventListener;

use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;

class FaqItemListener
{
    public function onPreCreate(ResourceControllerEvent $event): void
    {
        $item = $event->getSubject();
        // Logique metier avant la creation
        $item->setSlug(Slugger::slug($item->getTitle()));
    }
}

# services.yaml
App\EventListener\FaqItemListener:
  tags:
    - { name: kernel.event_listener, event: app.faq_item.pre_create }

Pourquoi c'est important

Le Resource Bundle est ce qui rend Sylius extensible sans etre fragile. En suivant ses conventions :

  • Vous ajoutez des entites avec quelques lignes de YAML
  • Les plugins s'integrent sans conflit car ils suivent le meme pattern
  • Les mises a jour Sylius n'impactent pas votre code custom
  • Les tests sont simplifies car les comportements sont previsibles

Pour aller plus loin, consultez notre article sur le Grid Bundle qui complete le Resource Bundle pour les vues admin.

Questions fréquentes

13 projets livrésGrand-Est & BelgiqueLighthouse >90Disponible immédiatement

Un projet en tête ?

Discutons de votre site web. Réponse garantie sous 24h.

Ou appelez directement :06 95 41 30 25

WhatsApp
Appeler