From 5993cb3642b940914720650600f0cb156c0c1189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Fr=C3=A9mont?= Date: Wed, 29 Apr 2026 18:26:03 +0200 Subject: [PATCH] [Admin] Split main menu builder with providers --- .../AdminBundle/Menu/CompositeMenuBuilder.php | 43 ++++++ .../AdminBundle/Menu/CustomersMenuBuilder.php | 57 ++++++++ .../AdminBundle/Menu/MainMenuBuilder.php | 3 + .../AdminBundle/Menu/MenuBuilderInterface.php | 24 +++ .../Menu/OfficialSupportProvider.php | 69 +++++++++ .../Main/AdministrationMenuProvider.php | 37 +++++ .../Provider/Main/CatalogMenuProvider.php | 87 +++++++++++ .../Main/ConfigurationMenuProvider.php | 137 ++++++++++++++++++ .../Provider/Main/DashboardMenuProvider.php | 29 ++++ .../Menu/Provider/Main/EventMenuProvider.php | 36 +++++ .../Provider/Main/MarketingMenuProvider.php | 60 ++++++++ .../Menu/Provider/Main/SalesMenuProvider.php | 54 +++++++ .../Menu/Provider/MenuProviderInterface.php | 10 ++ .../Resources/config/services/menu.php | 60 +++++++- 14 files changed, 703 insertions(+), 3 deletions(-) create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/CompositeMenuBuilder.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/CustomersMenuBuilder.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/MenuBuilderInterface.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/OfficialSupportProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/AdministrationMenuProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/CatalogMenuProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/ConfigurationMenuProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/DashboardMenuProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/EventMenuProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/MarketingMenuProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/SalesMenuProvider.php create mode 100644 src/Sylius/Bundle/AdminBundle/Menu/Provider/MenuProviderInterface.php diff --git a/src/Sylius/Bundle/AdminBundle/Menu/CompositeMenuBuilder.php b/src/Sylius/Bundle/AdminBundle/Menu/CompositeMenuBuilder.php new file mode 100644 index 0000000000..3b1c72c9ec --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/CompositeMenuBuilder.php @@ -0,0 +1,43 @@ + $providers + */ + public function __construct( + private FactoryInterface $factory, + private iterable $providers, + ) { + Assert::allImplementsInterface($this->providers, MenuProviderInterface::class); + } + + public function createMenu(array $options): ItemInterface + { + $menu = $this->factory->createItem('root'); + + foreach ($this->providers as $section) { + ($section)($menu); + } + + return $menu; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/CustomersMenuBuilder.php b/src/Sylius/Bundle/AdminBundle/Menu/CustomersMenuBuilder.php new file mode 100644 index 0000000000..7d88f7398d --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/CustomersMenuBuilder.php @@ -0,0 +1,57 @@ +menuBuilder->createMenu($options); + + $customers = $menu + ->addChild('customers') + ->setLabel('sylius.menu.admin.main.customers.header') + ->setLabelAttribute('icon', 'tabler:users') + ->setExtra('always_open', true) + ; + + $customers + ->addChild('customers', ['route' => 'sylius_admin_customer_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_customer_create'], + ['route' => 'sylius_admin_customer_update'], + ['route' => 'sylius_admin_customer_show'], + ]]]) + ->setLabel('sylius.menu.admin.main.customers.customers') + ->setLabelAttribute('icon', 'tabler:users') + ; + + $customers + ->addChild('groups', ['route' => 'sylius_admin_customer_group_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_customer_group_create'], + ['route' => 'sylius_admin_customer_group_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.customers.groups') + ->setLabelAttribute('icon', 'tabler:archive') + ; + + return $menu; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/MainMenuBuilder.php b/src/Sylius/Bundle/AdminBundle/Menu/MainMenuBuilder.php index afc2058a5a..1c5f2edd1e 100644 --- a/src/Sylius/Bundle/AdminBundle/Menu/MainMenuBuilder.php +++ b/src/Sylius/Bundle/AdminBundle/Menu/MainMenuBuilder.php @@ -19,6 +19,9 @@ use Sylius\Bundle\UiBundle\Menu\Event\MenuBuilderEvent; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Routing\RouterInterface; +/** + * @deprecated Use CompositeMenuBuilder instead. + */ final readonly class MainMenuBuilder { public const EVENT_NAME = 'sylius.menu.admin.main'; diff --git a/src/Sylius/Bundle/AdminBundle/Menu/MenuBuilderInterface.php b/src/Sylius/Bundle/AdminBundle/Menu/MenuBuilderInterface.php new file mode 100644 index 0000000000..8298224a02 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/MenuBuilderInterface.php @@ -0,0 +1,24 @@ + $options + */ + public function createMenu(array $options): ItemInterface; +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/OfficialSupportProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/OfficialSupportProvider.php new file mode 100644 index 0000000000..8bf073234b --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/OfficialSupportProvider.php @@ -0,0 +1,69 @@ +addChild('official_support') + ->setLabel('sylius.menu.admin.main.official_support.header') + ->setLabelAttribute('icon', 'tabler:info-circle') + ; + + $officialSupport + ->addChild('sylius_plus') + ->setUri('https://sylius.com/plus/') + ->setLinkAttribute('target', '_blank') + ->setLabel('sylius.menu.admin.main.official_support.sylius_plus') + ->setLabelAttribute('icon', 'tabler:plus') + ; + + $officialSupport + ->addChild('browse_plugins') + ->setUri('https://store.sylius.com/') + ->setLinkAttribute('target', '_blank') + ->setLabel('sylius.menu.admin.main.official_support.browse_plugins') + ->setLabelAttribute('icon', 'tabler:plug') + ; + + $officialSupport + ->addChild('professional_services') + ->setUri('https://sylius.com/services/') + ->setLinkAttribute('target', '_blank') + ->setLabel('sylius.menu.admin.main.official_support.professional_services') + ->setLabelAttribute('icon', 'tabler:settings-2') + ; + + $officialSupport + ->addChild('find_a_partner') + ->setUri('https://sylius.com/find-a-partner/') + ->setLinkAttribute('target', '_blank') + ->setLabel('sylius.menu.admin.main.official_support.find_a_partner') + ->setLabelAttribute('icon', 'tabler:heart-handshake') + ; + + $officialSupport + ->addChild('sylius_certification') + ->setUri('https://sylius.com/certification/') + ->setLinkAttribute('target', '_blank') + ->setLabel('sylius.menu.admin.main.official_support.sylius_certification') + ->setLabelAttribute('icon', 'tabler:certificate') + ; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/AdministrationMenuProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/AdministrationMenuProvider.php new file mode 100644 index 0000000000..9a183551ad --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/AdministrationMenuProvider.php @@ -0,0 +1,37 @@ +addChild('sylius.ui.administration') + ->setLabel('sylius.ui.administration') + ->setLabelAttribute('icon', 'tabler:lock') + ; + + $administration + ->addChild('roles') + ->setUri('https://sylius.com/plus/?utm_source=product&utm_medium=placeholder&utm_campaign=rbac-placeholder') + ->setLinkAttribute('target', '_blank') + ->setLabel('sylius.ui.roles') + ->setExtra('plus_logo', true) + ; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/CatalogMenuProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/CatalogMenuProvider.php new file mode 100644 index 0000000000..23bd289cdf --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/CatalogMenuProvider.php @@ -0,0 +1,87 @@ +addChild('catalog') + ->setLabel('sylius.menu.admin.main.catalog.header') + ->setLabelAttribute('icon', 'tabler:list-details') + ->setExtra('always_open', true) + ; + + $catalog + ->addChild('taxons', ['route' => 'sylius_admin_taxon_create', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_taxon_create_for_parent'], + ['route' => 'sylius_admin_taxon_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.catalog.taxons') + ->setLabelAttribute('icon', 'tabler:folder') + ; + + $catalog + ->addChild('products', ['route' => 'sylius_admin_product_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_product_create'], + ['route' => 'sylius_admin_product_create_simple'], + ['route' => 'sylius_admin_product_update'], + ['route' => 'sylius_admin_product_show'], + ['route' => 'sylius_admin_product_variant_index'], + ['route' => 'sylius_admin_product_variant_create'], + ['route' => 'sylius_admin_product_variant_update'], + ['route' => 'sylius_admin_product_variant_generate'], + ]]]) + ->setLabel('sylius.menu.admin.main.catalog.products') + ->setLabelAttribute('icon', 'tabler:cube') + ; + + $catalog + ->addChild('inventory', ['route' => 'sylius_admin_inventory_index']) + ->setLabel('sylius.menu.admin.main.catalog.inventory') + ->setLabelAttribute('icon', 'tabler:history') + ; + + $catalog + ->addChild('attributes', ['route' => 'sylius_admin_product_attribute_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_product_attribute_create'], + ['route' => 'sylius_admin_product_attribute_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.catalog.attributes') + ->setLabelAttribute('icon', 'tabler:cube-spark') + ; + + $catalog + ->addChild('options', ['route' => 'sylius_admin_product_option_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_product_option_create'], + ['route' => 'sylius_admin_product_option_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.catalog.options') + ->setLabelAttribute('icon', 'tabler:settings') + ; + + $catalog + ->addChild('association_types', ['route' => 'sylius_admin_product_association_type_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_product_association_type_create'], + ['route' => 'sylius_admin_product_association_type_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.catalog.association_types') + ->setLabelAttribute('icon', 'tabler:subtask') + ; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/ConfigurationMenuProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/ConfigurationMenuProvider.php new file mode 100644 index 0000000000..d7a3fd774a --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/ConfigurationMenuProvider.php @@ -0,0 +1,137 @@ +addChild('configuration') + ->setLabel('sylius.menu.admin.main.configuration.header') + ->setLabelAttribute('icon', 'tabler:adjustments') + ; + + $configuration + ->addChild('channels', ['route' => 'sylius_admin_channel_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_channel_create'], + ['route' => 'sylius_admin_channel_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.channels') + ->setLabelAttribute('icon', 'tabler:arrows-shuffle') + ; + + $configuration + ->addChild('countries', ['route' => 'sylius_admin_country_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_country_create'], + ['route' => 'sylius_admin_country_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.countries') + ->setLabelAttribute('icon', 'tabler:flag') + ; + + $configuration + ->addChild('zones', ['route' => 'sylius_admin_zone_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_zone_create'], + ['route' => 'sylius_admin_zone_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.zones') + ->setLabelAttribute('icon', 'tabler:world') + ; + + $configuration + ->addChild('currencies', ['route' => 'sylius_admin_currency_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_currency_create'], + ['route' => 'sylius_admin_currency_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.currencies') + ->setLabelAttribute('icon', 'tabler:currency-dollar') + ; + + $configuration + ->addChild('exchange_rates', ['route' => 'sylius_admin_exchange_rate_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_exchange_rate_create'], + ['route' => 'sylius_admin_exchange_rate_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.exchange_rates') + ->setLabelAttribute('icon', 'tabler:adjustments') + ; + + $configuration + ->addChild('locales', ['route' => 'sylius_admin_locale_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_locale_create'], + ['route' => 'sylius_admin_locale_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.locales') + ->setLabelAttribute('icon', 'tabler:bubble-text') + ; + + $configuration + ->addChild('payment_methods', ['route' => 'sylius_admin_payment_method_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_payment_method_create'], + ['route' => 'sylius_admin_payment_method_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.payment_methods') + ->setLabelAttribute('icon', 'tabler:credit-card-pay') + ; + + $configuration + ->addChild('shipping_methods', ['route' => 'sylius_admin_shipping_method_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_shipping_method_create'], + ['route' => 'sylius_admin_shipping_method_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.shipping_methods') + ->setLabelAttribute('icon', 'tabler:truck') + ; + + $configuration + ->addChild('shipping_categories', ['route' => 'sylius_admin_shipping_category_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_shipping_category_create'], + ['route' => 'sylius_admin_shipping_category_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.shipping_categories') + ->setLabelAttribute('icon', 'tabler:layout-list') + ; + + $configuration + ->addChild('tax_categories', ['route' => 'sylius_admin_tax_category_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_tax_category_create'], + ['route' => 'sylius_admin_tax_category_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.tax_categories') + ->setLabelAttribute('icon', 'tabler:tags') + ; + + $configuration + ->addChild('tax_rates', ['route' => 'sylius_admin_tax_rate_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_tax_rate_create'], + ['route' => 'sylius_admin_tax_rate_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.tax_rates') + ->setLabelAttribute('icon', 'tabler:coins') + ; + + $configuration + ->addChild('admin_users', ['route' => 'sylius_admin_admin_user_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_admin_user_create'], + ['route' => 'sylius_admin_admin_user_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.configuration.admin_users') + ->setLabelAttribute('icon', 'tabler:lock') + ; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/DashboardMenuProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/DashboardMenuProvider.php new file mode 100644 index 0000000000..da1eec25b7 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/DashboardMenuProvider.php @@ -0,0 +1,29 @@ +addChild('dashboard', ['route' => 'sylius_admin_dashboard']) + ->setLabel('sylius.ui.dashboard') + ->setLabelAttribute('icon', 'tabler:dashboard') + ; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/EventMenuProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/EventMenuProvider.php new file mode 100644 index 0000000000..d29033f331 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/EventMenuProvider.php @@ -0,0 +1,36 @@ +eventDispatcher->dispatch(new MenuBuilderEvent($this->factory, $menu), self::EVENT_NAME); + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/MarketingMenuProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/MarketingMenuProvider.php new file mode 100644 index 0000000000..852e892358 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/MarketingMenuProvider.php @@ -0,0 +1,60 @@ +addChild('marketing') + ->setLabel('sylius.menu.admin.main.marketing.header') + ->setLabelAttribute('icon', 'tabler:percentage') + ; + + $marketing + ->addChild('promotions', ['route' => 'sylius_admin_promotion_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_promotion_create'], + ['route' => 'sylius_admin_promotion_update'], + ['route' => 'sylius_admin_promotion_coupon_index'], + ['route' => 'sylius_admin_promotion_coupon_create'], + ['route' => 'sylius_admin_promotion_coupon_update'], + ['route' => 'sylius_admin_promotion_coupon_generate'], + ]]]) + ->setLabel('sylius.menu.admin.main.marketing.cart_promotions') + ->setLabelAttribute('icon', 'tabler:shopping-cart-down') + ; + + $marketing + ->addChild('catalog_promotions', ['route' => 'sylius_admin_catalog_promotion_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_catalog_promotion_create'], + ['route' => 'sylius_admin_catalog_promotion_update'], + ['route' => 'sylius_admin_catalog_promotion_show'], + ]]]) + ->setLabel('sylius.menu.admin.main.marketing.catalog_promotions') + ->setLabelAttribute('icon', 'tabler:bookmark') + ; + + $marketing + ->addChild('product_reviews', ['route' => 'sylius_admin_product_review_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_product_review_update'], + ]]]) + ->setLabel('sylius.menu.admin.main.marketing.product_reviews') + ->setLabelAttribute('icon', 'tabler:news') + ; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/SalesMenuProvider.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/SalesMenuProvider.php new file mode 100644 index 0000000000..198c610554 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/Main/SalesMenuProvider.php @@ -0,0 +1,54 @@ +addChild('sales') + ->setLabel('sylius.menu.admin.main.sales.header') + ->setLabelAttribute('icon', 'tabler:shopping-bag') + ->setExtra('always_open', true) + ; + + $sales + ->addChild('orders', ['route' => 'sylius_admin_order_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_order_update'], + ['route' => 'sylius_admin_order_show'], + ['route' => 'sylius_admin_order_history'], + ]]]) + ->setLabel('sylius.menu.admin.main.sales.orders') + ->setLabelAttribute('icon', 'tabler:shopping-cart') + ; + + $sales + ->addChild('payments', ['route' => 'sylius_admin_payment_index']) + ->setLabel('sylius.ui.payments') + ->setLabelAttribute('icon', 'tabler:credit-card-pay') + ; + + $sales + ->addChild('shipments', ['route' => 'sylius_admin_shipment_index', 'extras' => ['routes' => [ + ['route' => 'sylius_admin_shipment_show'], + ]]]) + ->setLabel('sylius.ui.shipments') + ->setLabelAttribute('icon', 'tabler:truck') + ; + } +} diff --git a/src/Sylius/Bundle/AdminBundle/Menu/Provider/MenuProviderInterface.php b/src/Sylius/Bundle/AdminBundle/Menu/Provider/MenuProviderInterface.php new file mode 100644 index 0000000000..594cc111bf --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Menu/Provider/MenuProviderInterface.php @@ -0,0 +1,10 @@ +services(); + $services->set('sylius_admin.menu_builder.main', 'sylius_admin.menu_builder.main.composite'); + $services - ->set('sylius_admin.menu_builder.main', MainMenuBuilder::class) + ->set('sylius_admin.menu_builder.main.composite', CompositeMenuBuilder::class) ->args([ service('knp_menu.factory'), - service('event_dispatcher'), + tagged_iterator('sylius_admin.main_menu_provider'), service('router'), ]) ->tag('knp_menu.menu_builder', ['method' => 'createMenu', 'alias' => 'sylius_admin.main']) ; + + $services + ->set('sylius_admin.menu_builder.provider.main.dashboard', DashboardMenuProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -100]) + ; + + $services + ->set('sylius_admin.menu_builder.provider.main.catalog', CatalogMenuProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -200]) + ; + + $services + ->set('sylius_admin.menu_builder.provider.main.sales', SalesMenuProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -300]) + ; + + $services + ->set('sylius_admin.menu_builder.provider.main.marketing', MarketingMenuProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -400]) + ; + + $services + ->set('sylius_admin.menu_builder.provider.main.configuration', ConfigurationMenuProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -500]) + ; + + $services + ->set('sylius_admin.menu_builder.provider.main.official_support', OfficialSupportProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -600]) + ; + + $services + ->set('sylius_admin.menu_builder.provider.main.administration', AdministrationMenuProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -700]) + ; + + $services + ->set('sylius_admin.menu_builder.main.event', EventMenuProvider::class) + ->tag('sylius_admin.main_menu_provider', ['priority' => -9999]) + ->args([ + service('knp_menu.factory'), + service('event_dispatcher'), + ]) + ; };