API Platform & Sylius

Une histoire d'amour​ 💞

1995

floflax.io

🎂

2005

🎉

2000

🥳

2015

🎁

1995

2000

2015

2005

2013

floflax.io

1995

2000

2015

2005

2013

1996

floflax.io

2022

🛒 e-commerce

🧱 stack

floflax.io

grid-bundle

resource-bundle

grid-bundle

🛒 e-commerce

🧱 stack

floflax.io

grid-bundle

resource-bundle

grid-bundle

🧱 stack

🛒 e-commerce

floflax.io

floflax.io

Travel planner

🧑‍💻

API suggestions

🔌

🐛

floflax.io

💡

Moteur de feature flags

floflax.io

Moteur de feature flags
API suggestions

🔌

Travel planner

🧑‍💻

floflax.io

Moteur de feature flags
API suggestions

🔌

Travel planner

🧑‍💻

floflax.io

Moteur de feature flags

Consulter l'état d'un flag

Modifier l'état d'un flag

Consulter l'état d'un flag

Admin
App

floflax.io

Implémentation de l'app

CRUD IHM

floflax.io

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      

👉

floflax.io

CRUD REST

floflax.io

Sous le capot

floflax.io

$ 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

  1. Récupérer une resource
  2. Agir sur la resource 

floflax.io

Request

📨

Response

💬

⚙️ MainController

  1. Récupérer une resource
  2. 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);
    }
}

floflax.io

🧪 Providers

api_platform.state_provider.main

floflax.io

🧪 Providers

api_platform.state_provider.main

ContentNegotiationProvider

ParameterProvider

ParameterValidatorProvider

AccessCheckerProvider

ValidateProvider

AccessCheckerProvider

DeserializeProvider

SecurityParameterProvider

floflax.io

ContentNegotiationProvider

ParameterProvider

ParameterValidatorProvider

AccessCheckerProvider

ValidateProvider

AccessCheckerProvider

DeserializeProvider

SecurityParameterProvider

AccessCheckerProvider

SwaggerUiProvider

ReadProvider

floflax.io

🧪 Providers

api_platform.state_provider.main

🧠 Processors

api_platform.state_processor.main

floflax.io

🧠 Processors

api_platform.state_processor.main

WriteProcessor

SerializeProcessor

AddHeadersProcessor

AddLinkHeaderProcessor

HydraLinkProcessor

RespondProcessor

floflax.io

Client

🧑‍💻

Serveur

🌐

  • HTML
  • JSON
  • image/png
  • ...

floflax.io

https://example.com/resource/123

floflax.io

Client

🧑‍💻

JSON
https://example.com/api/flag/123

floflax.io

floflax.io

Client

🧑‍💻

HTML
https://example.com/admin/flag/123

floflax.io

https://x.com/loic_425/status/1735950788051050752

floflax.io

https://github.com/Sylius/SyliusResourceBundle/pull/817

🧪 Providers

sylius.state_provider.main

floflax.io

🧪 Providers

sylius.state_provider.main

SecurityProvider

ValidateProvider

FormProvider

DeserializeProvider

DispatchPostReadEventProvider

FactoryProvider

ReadProvider

Provider

floflax.io

🧠 Processors

sylius.state_processor.main

floflax.io

🧠 Processors

sylius.state_processor.main

WriteProcessor

SerializeProcessor

FlashProcessor

RespondProcessor

floflax.io

App sur-mesure

RAD

CRUD IHM

CRUD REST

floflax.io

floflax.io

API Platform & Sylius

Une histoire d'amour​ 💞

floflax.io

  • 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

merci ! 🚀

floflax.io

Aller plus loin ...

Une ressource pour un CRUD – API Platform & Sylius : une histoire d'amour

By Florian Merle