Everyone has the opportunity to be a pioneer.
Everyone has the opportunity to be a pioneer.
Tech Talk
Creating a Sylius Plugin: A Developer's Guide
Creating a Sylius Plugin: A Developer's Guide
Egbert Wietses
06
.
10
.
2024
4 min read



Developing a plugin for Sylius can be a rewarding process, enabling developers to extend the functionality of this powerful e-commerce platform. This comprehensive guide will take you through the steps of creating a Sylius plugin, from initial setup to deployment, covering essential aspects such as plugin architecture, configuration, and testing.
Understanding the Plugin Architecture
Sylius is built on the Symfony framework, which means its plugins follow Symfony's bundle architecture. A Sylius plugin is essentially a Symfony bundle with additional conventions specific to Sylius. Understanding this architecture is crucial for developing robust plugins.
1. Plugin Structure: A typical Sylius plugin contains several key components, including:
Entity: Represents the data model.
Repository: Manages database operations for the entity.
Service: Contains the business logic.
Controller: Handles HTTP requests and responses.
Form: Manages form creation and validation.
Twig Templates: Defines the user interface.
2. Dependency Injection: Sylius relies heavily on Symfony's dependency injection component, which allows for services to be automatically injected where needed. This facilitates the decoupling of components and promotes modularity.
Sylius is built on the Symfony framework, which means its plugins follow Symfony's bundle architecture. A Sylius plugin is essentially a Symfony bundle with additional conventions specific to Sylius. Understanding this architecture is crucial for developing robust plugins.
1. Plugin Structure: A typical Sylius plugin contains several key components, including:
Entity: Represents the data model.
Repository: Manages database operations for the entity.
Service: Contains the business logic.
Controller: Handles HTTP requests and responses.
Form: Manages form creation and validation.
Twig Templates: Defines the user interface.
2. Dependency Injection: Sylius relies heavily on Symfony's dependency injection component, which allows for services to be automatically injected where needed. This facilitates the decoupling of components and promotes modularity.
Sylius is built on the Symfony framework, which means its plugins follow Symfony's bundle architecture. A Sylius plugin is essentially a Symfony bundle with additional conventions specific to Sylius. Understanding this architecture is crucial for developing robust plugins.
1. Plugin Structure: A typical Sylius plugin contains several key components, including:
Entity: Represents the data model.
Repository: Manages database operations for the entity.
Service: Contains the business logic.
Controller: Handles HTTP requests and responses.
Form: Manages form creation and validation.
Twig Templates: Defines the user interface.
2. Dependency Injection: Sylius relies heavily on Symfony's dependency injection component, which allows for services to be automatically injected where needed. This facilitates the decoupling of components and promotes modularity.
Setting Up the Development Environment
Before you begin creating a plugin, ensure you have a Sylius project set up. You can create a new Sylius project using Composer:
bash composer create-project sylius/sylius-standard my-sylius-project
Navigate to the project directory and install the necessary dependencies:
bash cd my-sylius-project composer install
Before you begin creating a plugin, ensure you have a Sylius project set up. You can create a new Sylius project using Composer:
bash composer create-project sylius/sylius-standard my-sylius-project
Navigate to the project directory and install the necessary dependencies:
bash cd my-sylius-project composer install
Before you begin creating a plugin, ensure you have a Sylius project set up. You can create a new Sylius project using Composer:
bash composer create-project sylius/sylius-standard my-sylius-project
Navigate to the project directory and install the necessary dependencies:
bash cd my-sylius-project composer install
Creating the Plugin Skeleton
You can use the Sylius Plugin Skeleton to bootstrap your plugin development. Clone the skeleton repository and set up your plugin:
bash composer create-project sylius/plugin-skeleton my-sylius-plugin
Navigate to the plugin directory and customise the composer.json file to reflect your plugin’s information. Update the name, description, and autoload sections.
You can use the Sylius Plugin Skeleton to bootstrap your plugin development. Clone the skeleton repository and set up your plugin:
bash composer create-project sylius/plugin-skeleton my-sylius-plugin
Navigate to the plugin directory and customise the composer.json file to reflect your plugin’s information. Update the name, description, and autoload sections.
You can use the Sylius Plugin Skeleton to bootstrap your plugin development. Clone the skeleton repository and set up your plugin:
bash composer create-project sylius/plugin-skeleton my-sylius-plugin
Navigate to the plugin directory and customise the composer.json file to reflect your plugin’s information. Update the name, description, and autoload sections.
Defining the Data Model
Your plugin’s data model is defined using Doctrine entities. Create a new entity class in the Entity directory:
php namespace My\SyliusPlugin\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="my_plugin_entity") / class MyEntity { /* * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; // Other fields and their annotations }
Your plugin’s data model is defined using Doctrine entities. Create a new entity class in the Entity directory:
php namespace My\SyliusPlugin\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="my_plugin_entity") / class MyEntity { /* * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; // Other fields and their annotations }
Your plugin’s data model is defined using Doctrine entities. Create a new entity class in the Entity directory:
php namespace My\SyliusPlugin\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="my_plugin_entity") / class MyEntity { /* * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; // Other fields and their annotations }
Creating the Repository
The repository handles data access logic. Create a repository class in the Repository directory:
php namespace My\SyliusPlugin\Repository; use Doctrine\ORM\EntityRepository; class MyEntityRepository extends EntityRepository { // Custom repository methods }
The repository handles data access logic. Create a repository class in the Repository directory:
php namespace My\SyliusPlugin\Repository; use Doctrine\ORM\EntityRepository; class MyEntityRepository extends EntityRepository { // Custom repository methods }
The repository handles data access logic. Create a repository class in the Repository directory:
php namespace My\SyliusPlugin\Repository; use Doctrine\ORM\EntityRepository; class MyEntityRepository extends EntityRepository { // Custom repository methods }
Defining Services
Services contain the business logic of your plugin. Define your services in the services.yaml file and create the corresponding service class:
yaml services: my_sylius_plugin.service.my_service: class: My\SyliusPlugin\Service\MyService arguments: ['@doctrine.orm.entity_manager'] php namespace My\SyliusPlugin\Service; class MyService { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } // Service methods }
Services contain the business logic of your plugin. Define your services in the services.yaml file and create the corresponding service class:
yaml services: my_sylius_plugin.service.my_service: class: My\SyliusPlugin\Service\MyService arguments: ['@doctrine.orm.entity_manager'] php namespace My\SyliusPlugin\Service; class MyService { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } // Service methods }
Services contain the business logic of your plugin. Define your services in the services.yaml file and create the corresponding service class:
yaml services: my_sylius_plugin.service.my_service: class: My\SyliusPlugin\Service\MyService arguments: ['@doctrine.orm.entity_manager'] php namespace My\SyliusPlugin\Service; class MyService { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } // Service methods }
Creating Controllers
Controllers handle HTTP requests and responses. Create a controller class in the Controller directory:
php namespace My\SyliusPlugin\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class MyController extends AbstractController { public function indexAction(): Response { // Handle the request and return a response } }
Controllers handle HTTP requests and responses. Create a controller class in the Controller directory:
php namespace My\SyliusPlugin\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class MyController extends AbstractController { public function indexAction(): Response { // Handle the request and return a response } }
Controllers handle HTTP requests and responses. Create a controller class in the Controller directory:
php namespace My\SyliusPlugin\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class MyController extends AbstractController { public function indexAction(): Response { // Handle the request and return a response } }
Creating Forms and Templates
Forms manage user input and validation. Create a form class in the Form directory: php namespace
My\SyliusPlugin\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class MyFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', TextType::class); // Other form fields } }
Create Twig templates in the templates directory to define the user interface. These templates are used by your controllers to render views.
Forms manage user input and validation. Create a form class in the Form directory: php namespace
My\SyliusPlugin\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class MyFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', TextType::class); // Other form fields } }
Create Twig templates in the templates directory to define the user interface. These templates are used by your controllers to render views.
Forms manage user input and validation. Create a form class in the Form directory: php namespace
My\SyliusPlugin\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class MyFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', TextType::class); // Other form fields } }
Create Twig templates in the templates directory to define the user interface. These templates are used by your controllers to render views.
Configuring the Plugin
Your plugin needs to be registered in the Sylius application. Add the plugin to the config/bundles.php
file:
php return [ // Other bundles My\SyliusPlugin\MySyliusPlugin::class => ['all' => true], ]; Configure the plugin’s routes in the config/routes.yaml file: yaml my_sylius_plugin: resource:"@MySyliusPlugin/Resources/config/routing.yaml" prefix: /admin
Your plugin needs to be registered in the Sylius application. Add the plugin to the config/bundles.php
file:
php return [ // Other bundles My\SyliusPlugin\MySyliusPlugin::class => ['all' => true], ]; Configure the plugin’s routes in the config/routes.yaml file: yaml my_sylius_plugin: resource:"@MySyliusPlugin/Resources/config/routing.yaml" prefix: /admin
Your plugin needs to be registered in the Sylius application. Add the plugin to the config/bundles.php
file:
php return [ // Other bundles My\SyliusPlugin\MySyliusPlugin::class => ['all' => true], ]; Configure the plugin’s routes in the config/routes.yaml file: yaml my_sylius_plugin: resource:"@MySyliusPlugin/Resources/config/routing.yaml" prefix: /admin
Testing the Plugin
Testing is crucial to ensure your plugin works as expected. Sylius encourages a test-driven development approach. Create test cases for your plugin using PHPUnit and Behat. Place unit tests in the tests directory and integration tests in the tests/Integration directory.
Testing is crucial to ensure your plugin works as expected. Sylius encourages a test-driven development approach. Create test cases for your plugin using PHPUnit and Behat. Place unit tests in the tests directory and integration tests in the tests/Integration directory.
Testing is crucial to ensure your plugin works as expected. Sylius encourages a test-driven development approach. Create test cases for your plugin using PHPUnit and Behat. Place unit tests in the tests directory and integration tests in the tests/Integration directory.
Deploying the Plugin
Once your plugin is developed and tested, it’s ready for deployment. Ensure your plugin’s code is clean and well-documented. Tag a release in your version control system and publish the plugin on a package repository like Packagist. This makes it accessible for installation via Composer. To install the plugin in a Sylius project, run:
bash composer require my/sylius-plugin
Finally, run any necessary database migrations and update the Sylius cache:
bash bin/console doctrine:migrations:migrate bin/console cache:clear
Once your plugin is developed and tested, it’s ready for deployment. Ensure your plugin’s code is clean and well-documented. Tag a release in your version control system and publish the plugin on a package repository like Packagist. This makes it accessible for installation via Composer. To install the plugin in a Sylius project, run:
bash composer require my/sylius-plugin
Finally, run any necessary database migrations and update the Sylius cache:
bash bin/console doctrine:migrations:migrate bin/console cache:clear
Once your plugin is developed and tested, it’s ready for deployment. Ensure your plugin’s code is clean and well-documented. Tag a release in your version control system and publish the plugin on a package repository like Packagist. This makes it accessible for installation via Composer. To install the plugin in a Sylius project, run:
bash composer require my/sylius-plugin
Finally, run any necessary database migrations and update the Sylius cache:
bash bin/console doctrine:migrations:migrate bin/console cache:clear
Conclusion
Creating a Sylius plugin involves understanding the underlying architecture, setting up a development environment, defining the data model, creating repositories, services, and controllers, managing forms and templates, configuring the plugin, testing, and finally deploying it. By following this comprehensive guide, developers can extend Sylius’s capabilities to meet specific business requirements, contributing to a more flexible and powerful e-commerce platform.
Creating a Sylius plugin involves understanding the underlying architecture, setting up a development environment, defining the data model, creating repositories, services, and controllers, managing forms and templates, configuring the plugin, testing, and finally deploying it. By following this comprehensive guide, developers can extend Sylius’s capabilities to meet specific business requirements, contributing to a more flexible and powerful e-commerce platform.
Creating a Sylius plugin involves understanding the underlying architecture, setting up a development environment, defining the data model, creating repositories, services, and controllers, managing forms and templates, configuring the plugin, testing, and finally deploying it. By following this comprehensive guide, developers can extend Sylius’s capabilities to meet specific business requirements, contributing to a more flexible and powerful e-commerce platform.
related blogs
Read More
Read More
related blogs
Read More
Read More
related blogs
Read More
Read More
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
sign up for the insights
amsterdam
rotterdam
portland
© 2025 Pionect. All rights reserved.
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
sign up for the insights
amsterdam
rotterdam
portland
© 2025 Pionect. All rights reserved.
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
sign up for the insights
amsterdam
rotterdam
portland
© 2025 Pionect. All rights reserved.
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
Start the Conversation
Let’s talk about how custom software can solve your toughest challenges and drive growth.
sign up for the insights
amsterdam
rotterdam
portland
© 2025 Pionect. All rights reserved.