Florian Merle
👨💻 Dev at AKAWAKA | Sylius Key contributor & Symfony certified | VIM lover! 🚀
🛒 e-commerce
🧱 stack
grid-bundle
resource-bundle
grid-bundle
🛒 e-commerce
🧱 stack
grid-bundle
resource-bundle
grid-bundle
🧱 stack
🛒 e-commerce
Travel planner
API suggestions
Moteur de feature flags
Moteur de feature flags
API suggestions
Travel planner
Moteur de feature flags
API suggestions
Travel planner
Moteur de feature flags
Consulter l'état d'un flag
Modifier l'état d'un flag
Consulter l'état d'un flag
Admin
App
sylius_resource:
resources:
app.feature_flag:
driver: doctrine/orm
classes:
model: App\Entity\FeatureFlag\FeatureToggle
repository: App\Repository\FeatureFlag\FeatureToggleRepository
form: App\Form\Type\FeatureFlag\FeatureToggleType
translation:
classes:
model: App\Entity\FeatureFlag\FeatureToggleTranslation
form: App\Form\Type\FeatureFlag\FeatureToggleTranslationType
app.flag_group:
driver: doctrine/orm
classes:
model: App\Entity\FeatureFlag\FlagGroup
repository: App\Repository\FeatureFlag\FlagGroupRepository
form: App\Form\Type\FeatureFlag\FlagGroupType
app.rollout_strategy:
driver: doctrine/orm
classes:
model: App\Entity\FeatureFlag\RolloutStrategy
form: App\Form\Type\FeatureFlag\RolloutStrategyType
repository: App\Repository\FeatureFlag\RolloutStrategyRepository
# ............
grids:
app_admin_feature_flag:
limits: [10, 25, 50]
filters:
search:
type: string
label: app.ui.search
options:
fields: [ code, translation.name, description ]
enabled:
type: boolean
label: app.ui.enabled
environment:
type: choice
label: app.ui.environment
options:
choices:
- { label: "Production", value: "prod" }
- { label: "Staging", value: "staging" }
- { label: "Development", value: "dev" }
rolloutStrategy:
type: choice
label: app.ui.rollout_strategy
options:
choices: [ "Percentage", "Targeted Users", "Gradual Rollout" ]
fields:
code:
label: app.ui.code
name:
type: twig
label: app.ui.name
options:
template: 'Admin/FeatureFlag/Grid/Field/name.html.twig'
enabled:
type: boolean
label: app.ui.enabled
actions:
bulk:
enable_flags:
type: bulk_action
label: app.ui.enable_flags
options:
icon: check
link:
route: app_admin_feature_flag_bulk_enable
disable_flags:
type: bulk_action
label: app.ui.disable_flags
options:
icon: ban
link:
route: app_admin_feature_flag_bulk_disable
👉
👇
👉
👉
app_admin_feature_flag:
resource: |
alias: app.feature_flag
section: admin
templates: '@SyliusAdmin\Crud'
except: ['show', 'create', 'update']
grid: app_admin_feature_flag
vars:
all:
subheader: app.ui.manage_feature_flags
index:
icon: toggle on
templates:
header_title: 'Admin/FeatureFlag/Index/_headerTitle.html.twig'
breadcrumb: 'Admin/FeatureFlag/Index/_breadcrumb.html.twig'
create:
templates:
form: 'Admin/FeatureFlag/_form.html.twig'
update:
templates:
form: 'Admin/FeatureFlag/_form.html.twig'
toolbar: 'Admin/FeatureFlag/_toolbar.html.twig'
type: sylius.resource
app_admin_feature_flag_edit:
path: /feature-flags/{id}/edit
methods: [GET]
defaults:
_controller: app.controller.feature_flag::updateAction
_sylius:
template: 'Admin/FeatureFlag/configure.html.twig'
section: admin
permussion: true
app_admin_feature_flag_duplicate:
path: /feature-flags/{id}/duplicate
methods: [GET, PUT]
defaults:
_controller: app.controller.feature_flag::createAction
_sylius:
section: admin
factory:
method: createFromFlag
arguments:
original: $id
template: "@SyliusAdmin/Crud/create.html.twig"
redirect: app_admin_feature_flag_update
vars:
header: app.ui.duplicate_feature_flag
subheader: app.ui.manage_feature_flags
templates:
form: "Admin/FeatureFlag/_form.html.twig"
app_admin_feature_flag_show:
path: /feature-flags/{id}/show
methods: [GET]
defaults:
_controller: app.controller.feature_flag::showAction
_sylius:
template: 'Admin/FeatureFlag/show.html.twig'
section: admin
👉
$ php bin/console debug:router --show-controllers | grep feature_flag
_api_/feature_flags/_get GET /api/feature_flags/{code} api_platform.symfony.main_controller()
_api_/feature_flags_get_collection GET /api/feature_flags api_platform.symfony.main_controller()
_api_/feature_flags/_patch PATCH /api/feature_flags/{code} api_platform.symfony.main_controller()
Request
📨
Response
💬
⚙️ MainController
Récupérer une resource
Agir sur la resource
Request
📨
Response
💬
⚙️ MainController
Récupérer une resource
Agir sur la resource
final class MainController
{
public function __construct(
private ProviderInterface $provider,
private ProcessorInterface $processor,
) {
}
public function __invoke(Request $request): Response
{
$operation = ...
$context = ...
$data = $this->provider->provide($operation, $context);
return $this->processor->process($data, $operation, $context);
}
}
api_platform.state_provider.main
api_platform.state_provider.main
ContentNegotiationProvider
ParameterProvider
ParameterValidatorProvider
AccessCheckerProvider
ValidateProvider
AccessCheckerProvider
DeserializeProvider
SecurityParameterProvider
ContentNegotiationProvider
ParameterProvider
ParameterValidatorProvider
AccessCheckerProvider
ValidateProvider
AccessCheckerProvider
DeserializeProvider
SecurityParameterProvider
AccessCheckerProvider
SwaggerUiProvider
ReadProvider
api_platform.state_provider.main
api_platform.state_processor.main
api_platform.state_processor.main
WriteProcessor
SerializeProcessor
AddHeadersProcessor
AddLinkHeaderProcessor
HydraLinkProcessor
RespondProcessor
Client
Serveur
HTML
JSON
image/png
...
https://example.com/resource/123
Client
JSON
https://example.com/api/flag/123
Client
HTML
https://example.com/admin/flag/123
https://x.com/loic_425/status/1735950788051050752
https://github.com/Sylius/SyliusResourceBundle/pull/817
sylius.state_provider.main
sylius.state_provider.main
SecurityProvider
ValidateProvider
FormProvider
DeserializeProvider
DispatchPostReadEventProvider
FactoryProvider
ReadProvider
Provider
sylius.state_processor.main
sylius.state_processor.main
WriteProcessor
SerializeProcessor
FlashProcessor
RespondProcessor
App sur-mesure
✅
✅
RAD
✅
✅
CRUD IHM
❌
✅
CRUD REST
✅
❌
Bring Sylius Components to Your Project - AKAWAKA
Du DDD avec API Platform - Mathias ARLAUD & Robin CHALAS
How to use in a DDD architecture - Doc Sylius
By Florian Merle
Aller plus loin https://www.akawaka.fr/bring-sylius-components-to-your-project/ https://www.youtube.com/watch?v=SSQal3Msi9g https://docs.sylius.com/sylius-stack/cookbook/ddd_architecture
👨💻 Dev at AKAWAKA | Sylius Key contributor & Symfony certified | VIM lover! 🚀