Installation
composer require agence-adeliom/easy-shop-bundle
bin/console sylius:install:check-requirements
Verify PHP version (^7.4|^8.0) and dependencies (e.g., ext-json).
Configure Security
Update config/packages/security.yaml with:
Sylius\Component\User\Model\UserInterface (e.g., argon2i).sylius_api_admin_user_provider, sylius_shop_user_provider).new_api_admin_user, new_api_shop_user) and shop (shop).ROLE_USER for /account).Initialize Sylius
bin/console sylius:install:setup
This sets up databases, fixtures, and default configurations.
First Integration
Extend EasyAdmin with shop routes by adding the bundle’s CRUD controllers to your EasyAdmin dashboard configuration:
# config/easyadmin.yaml
easy_admin:
entities:
Sylius\Bundle\CoreBundle\Entity\Product: ~
Sylius\Bundle\CoreBundle\Entity\Order: ~
Admin Panel Integration
EasyAdmin CRUD for Sylius entities (e.g., Product, Order, Customer).agence-adeliom/easy-fields-bundle for Sylius-specific attributes (e.g., price, stock).// src/Controller/Admin/ProductCrudController.php
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
class ProductCrudController extends AbstractCrudController {
public function configureFields(string $pageName): iterable {
yield AssociationField::new('category')->autocomplete();
yield TextField::new('name');
yield MoneyField::new('price')->setCurrency('EUR');
}
}
Shop Frontend
/shop, /cart) via sylius_shop_regex in security.yaml.twig/Shop/Product/show.html.twig) for custom UI.EasyPageBundle for dynamic shop pages (e.g., CMS-driven product pages).API Development
lexik_jwt_authentication).# config/routes.yaml
sylius_shop_api_product:
path: /api/products
controller: sylius.controller.product:showAction
methods: GET
curl -X POST -H "Content-Type: application/json" \
-d '{"email":"user@example.com","password":"password"}' \
http://your-app/_api/login
Event-Driven Extensions
sylius.order.completed) to extend functionality.// src/EventListener/OrderListener.php
use Sylius\Component\Core\Event\OrderEvents;
class OrderListener {
public function __construct(private MailerInterface $mailer) {}
public function onOrderCompleted(OrderCompletedEvent $event) {
$this->mailer->send(new OrderConfirmationEmail($event->getOrder()));
}
}
Register in services.yaml:
services:
App\EventListener\OrderListener:
tags:
- { name: kernel.event_listener, event: sylius.order.completed }
Security Misconfigurations
ROLE_USER for /account routes can expose sensitive data.sylius.security.shop_regex matches your shop routes exactly (e.g., /shop/*).Database Schema Conflicts
EasyAdmin or custom migrations. Run:
bin/console doctrine:migrations:diff
bin/console doctrine:migrations:migrate
after installing the bundle.JWT Authentication Issues
lexik_jwt_authentication is installed (composer require lexik/jwt-authentication-bundle).APP_SECRET is set in .env.security.yaml match your API routes.EasyAdmin CRUD Limitations
MoneyField for price). Use agence-adeliom/easy-fields-bundle for extensions:
use Adeliom\EasyFieldsBundle\Field\MoneyField;
yield MoneyField::new('price')->setCurrency('USD');
Enable Sylius Debug Mode
Add to config/packages/dev/sylius.yaml:
sylius:
debug: true
This logs events and entity changes.
Check Event Dispatching
Use bin/console debug:event-dispatcher to verify Sylius events are registered.
Override Sylius Templates
Copy templates from vendor/sylius/sylius/src/Resources/views to templates/Sylius/ to avoid updates overwriting changes.
Custom Fields
Extend EasyFieldsBundle to support Sylius-specific fields (e.g., TaxonField for product categories):
// src/Field/TaxonField.php
use Adeliom\EasyFieldsBundle\Field\AssociationField;
class TaxonField extends AssociationField {
protected static $defaultOptions = [
'label' => 'Category',
'entity' => Sylius\Bundle\CoreBundle\Entity\Taxon::class,
];
}
API Resource Customization
Override Sylius API controllers (e.g., ProductController) to add/remove fields:
// src/Controller/ProductApiController.php
use Sylius\Bundle\ApiBundle\Controller\ProductController as BaseController;
class ProductApiController extends BaseController {
public function showAction(ProductInterface $product) {
$data = $this->serializer->serialize($product, 'json', [
'attributes' => ['name', 'slug', 'price'], // Custom fields
]);
return new JsonResponse($data);
}
}
EasyAdmin Dashboard Integration
Add shop-specific widgets to the EasyAdmin dashboard:
# config/easyadmin.yaml
easy_admin:
dashboard:
title: Shop Dashboard
items:
- { entity: Sylius\Bundle\CoreBundle\Entity\Order, label: 'Recent Orders', icon: 'shopping-cart' }
Multi-Language Support
Use a2lix/translation-form-bundle for translatable Sylius entities (e.g., Product names):
# config/packages/a2lix_translation_form.yaml
a2lix_translation_form:
default_locale: en
supported_locales: [en, fr]
entity_manager: default
Then add translatable fields to your EasyAdmin CRUD:
yield TranslationField::new('name')->setTranslatable();
How can I help you explore Laravel packages today?