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 :
- Le controller generique recoit la requete
- La factory cree une instance vierge de l'entite
- Le form type hydrate l'entite avec les donnees du formulaire
- Un event
pre_createest dispatche (point d'extension) - Le repository persiste l'entite via Doctrine
- Un event
post_createest dispatche - 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.
