Everyone has the opportunity to be a pioneer.

Everyone has the opportunity to be a pioneer.

contact us

Tech Talk

Creating a Sylius Plugin: A Developer's Guide

Egbert Wietses

06

.

10

.

2024

4 min read

a line of code
a line of code
a line of code

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

related blogs

Read More

related blogs

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

KvK: 81812620

VAT: NL862228852B01 

© 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

KvK: 81812620

VAT: NL862228852B01 

© 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

KvK: 81812620

VAT: NL862228852B01 

© 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

© 2025 Pionect. All rights reserved.