<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pierre-Arthur DEMENGEL</title>
    <description>The latest articles on DEV Community by Pierre-Arthur DEMENGEL (@pierrearthurdemengel).</description>
    <link>https://dev.to/pierrearthurdemengel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3863227%2Fc0537f26-d7f2-4554-96d6-388ba87c8fd0.jpg</url>
      <title>DEV Community: Pierre-Arthur DEMENGEL</title>
      <link>https://dev.to/pierrearthurdemengel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pierrearthurdemengel"/>
    <language>en</language>
    <item>
      <title>Symfony 7 and Sylius 2.0: What Changes for Developers</title>
      <dc:creator>Pierre-Arthur DEMENGEL</dc:creator>
      <pubDate>Sat, 11 Apr 2026 20:25:31 +0000</pubDate>
      <link>https://dev.to/pierrearthurdemengel/symfony-7-and-sylius-20-what-changes-for-developers-ihe</link>
      <guid>https://dev.to/pierrearthurdemengel/symfony-7-and-sylius-20-what-changes-for-developers-ihe</guid>
      <description>&lt;p&gt;Sylius 2.0 supports both Symfony 6.4 LTS and Symfony 7.1+.&lt;/p&gt;

&lt;p&gt;For developers who've been running Sylius 1.x on Symfony 5 or 6, this means a significant stack modernization. Let's break down what Symfony 7 brings to the table and what it means concretely for your Sylius projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Symfony 7: What's Different
&lt;/h2&gt;

&lt;p&gt;Symfony 7 was released in November 2023. It's the "clean" major version that &lt;em&gt;removes&lt;/em&gt; everything deprecated in the 6.x cycle. If you've been ignoring deprecation notices, Symfony 7 is where they become fatal errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  PHP 8.2 Minimum
&lt;/h3&gt;

&lt;p&gt;Symfony 7 requires PHP 8.2+, and Sylius 2.0 aligns with that minimum. If your production servers still run PHP 8.1, you'll need to upgrade your runtime first.&lt;/p&gt;

&lt;p&gt;This is generally a good thing: PHP 8.2 brings readonly classes and significant performance improvements, and if you move to PHP 8.3 you also get typed class constants and the &lt;code&gt;json_validate()&lt;/code&gt; function.&lt;/p&gt;

&lt;h3&gt;
  
  
  All Deprecations Removed
&lt;/h3&gt;

&lt;p&gt;Every method, class, and configuration option that was marked &lt;code&gt;@deprecated&lt;/code&gt; in Symfony 6.x is gone in Symfony 7. The most impactful removals for Sylius projects include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: The old &lt;code&gt;security.encoders&lt;/code&gt; configuration is removed. You must use &lt;code&gt;security.password_hashers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mailer&lt;/strong&gt;: SwiftMailer integration has been removed (the library itself was abandoned by its maintainers in 2021). &lt;code&gt;symfony/mailer&lt;/code&gt; is the standard replacement in Sylius 2.0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing&lt;/strong&gt;: Docblock annotations (&lt;code&gt;@Route&lt;/code&gt; in comments, relying on SensioFrameworkExtraBundle) are no longer supported. Use PHP 8 attributes &lt;code&gt;#[Route]&lt;/code&gt;, which Symfony has supported since 5.2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DI&lt;/strong&gt;: Some container configuration shortcuts have been removed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  New Attributes-First Approach
&lt;/h3&gt;

&lt;p&gt;Symfony 7 doubles down on PHP attributes everywhere: routing, security voters, event subscribers, DI configuration. If your Sylius project still uses YAML or annotation-based configuration for custom controllers and services, now is the time to modernize.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Sylius 2.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Twig Hooks Become the Recommended Customization Approach
&lt;/h3&gt;

&lt;p&gt;This change is Sylius-specific, provided by the &lt;code&gt;sylius/twig-hooks&lt;/code&gt; package (which itself supports Symfony 6.4 and 7.x). The old pattern of overriding entire Twig templates by placing files in &lt;code&gt;templates/bundles/&lt;/code&gt; still works but is discouraged in favor of &lt;strong&gt;Twig Hooks&lt;/strong&gt;: a system where you register small template fragments that hook into specific extension points.&lt;/p&gt;

&lt;p&gt;Twig Hooks primarily replaces the older Sylius Template Events and Sonata Block Events systems. The benefit: your customizations are more granular and survive Sylius core updates more cleanly. The cost: existing template overrides need to be rewritten if you want to follow the new approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symfony Workflow Replaces winzou
&lt;/h3&gt;

&lt;p&gt;Sylius 1.x relied on &lt;code&gt;winzou/state-machine-bundle&lt;/code&gt; for order, payment, and shipping workflows. Sylius 2.0 uses Symfony's native Workflow component.&lt;/p&gt;

&lt;p&gt;Key differences for developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuration moves from &lt;code&gt;winzou_state_machine&lt;/code&gt; to &lt;code&gt;framework.workflows&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Callbacks become event subscribers listening to &lt;code&gt;workflow.transition&lt;/code&gt; events&lt;/li&gt;
&lt;li&gt;Guards use Symfony's expression language instead of service callbacks&lt;/li&gt;
&lt;li&gt;The Workflow component has better tooling: the &lt;code&gt;workflow:dump&lt;/code&gt; command generates visual diagrams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: the &lt;code&gt;winzou/state-machine-bundle&lt;/code&gt; package has been moved to the suggested dependencies in Sylius 2.0 and can still be installed manually if needed, but the core Sylius workflows have all migrated to Symfony Workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symfony UX Replaces jQuery
&lt;/h3&gt;

&lt;p&gt;The frontend migration isn't just a Sylius decision: it aligns with the broader Symfony ecosystem direction. Symfony UX (Turbo + Stimulus) is the official approach to frontend interactivity in Symfony applications.&lt;/p&gt;

&lt;p&gt;For Sylius developers, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more jQuery dependency&lt;/li&gt;
&lt;li&gt;Interactive features use Stimulus controllers instead of inline JS&lt;/li&gt;
&lt;li&gt;Page updates use Turbo Frames and Streams for partial page refreshes&lt;/li&gt;
&lt;li&gt;The asset pipeline changes (Webpack Encore configuration updates; Sylius 2.0 still uses Webpack Encore)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  API Platform 4
&lt;/h3&gt;

&lt;p&gt;Sylius 2.0 moves from API Platform 2.7 to API Platform 4, which brings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplified resource configuration (new XML schema &lt;code&gt;metadata/resources-3.0&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;State providers and processors replacing the older data providers and data persisters&lt;/li&gt;
&lt;li&gt;Improved OpenAPI documentation generation&lt;/li&gt;
&lt;li&gt;Improved JSON:API and GraphQL support at the API Platform level (note: Sylius 2.0 doesn't expose GraphQL endpoints by default, but you can enable them)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've written custom API Platform data providers, data persisters, or data transformers, they'll need to be rewritten as state providers, state processors, or serializer context builders. Namespaces change accordingly (for example, classes under &lt;code&gt;Sylius\Bundle\ApiBundle\DataProvider&lt;/code&gt; move to &lt;code&gt;Sylius\Bundle\ApiBundle\StateProvider&lt;/code&gt;). Sylius also prefixes all its serialization groups with &lt;code&gt;sylius:&lt;/code&gt; in 2.0, so any custom resource that extends Sylius groups needs to be updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Migration Path
&lt;/h2&gt;

&lt;p&gt;Here's the approach I recommend:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Prepare on Sylius 1.x (1–2 weeks, depending on project state)
&lt;/h3&gt;

&lt;p&gt;Before touching Sylius 2.0, clean up your current codebase:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upgrade to the latest Sylius 1.x release (1.14 LTS if you're not already there)&lt;/li&gt;
&lt;li&gt;Run PHPUnit with &lt;code&gt;SYMFONY_DEPRECATIONS_HELPER=strict&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fix all Symfony deprecations: encoders → password hashers, annotations → attributes, SwiftMailer → &lt;code&gt;symfony/mailer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Make sure your tests pass green&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 2: Audit (1–2 days)
&lt;/h3&gt;

&lt;p&gt;Run a comprehensive audit of your project to understand the full migration scope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Count template overrides&lt;/li&gt;
&lt;li&gt;List winzou state machine customizations&lt;/li&gt;
&lt;li&gt;Check plugin compatibility&lt;/li&gt;
&lt;li&gt;Inventory frontend customizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;a href="https://github.com/pierrearthurdemengel/sylius-upgrade-analyzer" rel="noopener noreferrer"&gt;Sylius Upgrade Analyzer&lt;/a&gt; helps. The CLI tool automates this entire audit, scanning your codebase with 49 analyzers organized into 6 thematic families (Templates &amp;amp; Frontend, Deprecations &amp;amp; Breaking Changes, Plugins, Grid &amp;amp; Resource, API Platform, Security) and producing a report with effort estimations. It runs locally, so your code doesn't leave your machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Backend Migration (1–4 weeks)
&lt;/h3&gt;

&lt;p&gt;Tackle backend changes in order of dependency:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update &lt;code&gt;composer.json&lt;/code&gt; to require Sylius 2.0&lt;/li&gt;
&lt;li&gt;Migrate state machine configuration and callbacks&lt;/li&gt;
&lt;li&gt;Update payment gateway integrations&lt;/li&gt;
&lt;li&gt;Fix any remaining deprecated API usages&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 4: Frontend Migration (1–4 weeks)
&lt;/h3&gt;

&lt;p&gt;This can often run in parallel with backend work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Replace Semantic UI classes with Bootstrap 5&lt;/li&gt;
&lt;li&gt;Convert jQuery code to Stimulus controllers&lt;/li&gt;
&lt;li&gt;Update asset build configuration&lt;/li&gt;
&lt;li&gt;Test all interactive features (cart, checkout, admin)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 5: Plugin Updates &amp;amp; QA (1–2 weeks)
&lt;/h3&gt;

&lt;p&gt;Update all plugins, run full regression tests, and validate payment flows. Remember that plugin compatibility varies: some (like several BitBag plugins) already have stable 2.x releases, others are still being ported.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Symfony 7 + Sylius 2.0 is a major modernization. The resulting stack is cleaner, more maintainable, and better aligned with the PHP ecosystem's direction. The migration effort is real but manageable with proper planning.&lt;/p&gt;

&lt;p&gt;The biggest risk isn't any single change: it's underestimating the combined scope. Audit first, plan methodically, and you'll come out the other side with a much better codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need help with your migration?
&lt;/h2&gt;

&lt;p&gt;Developed by Pierre-Arthur Demengel, freelance developer specialised in Sylius 1.x to 2.x migrations. Need help migrating your store? &lt;strong&gt;&lt;a href="https://creation-site-pro.fr/en/sylius-2-upgrade?utm_source=devto" rel="noopener noreferrer"&gt;Get a free diagnosis&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>sylius</category>
      <category>symfony</category>
      <category>php</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Top 10 Mistakes When Migrating Sylius to 2.0</title>
      <dc:creator>Pierre-Arthur DEMENGEL</dc:creator>
      <pubDate>Sat, 11 Apr 2026 20:21:01 +0000</pubDate>
      <link>https://dev.to/pierrearthurdemengel/top-10-mistakes-when-migrating-sylius-to-20-11nn</link>
      <guid>https://dev.to/pierrearthurdemengel/top-10-mistakes-when-migrating-sylius-to-20-11nn</guid>
      <description>&lt;p&gt;After helping several teams plan their Sylius 1.x → 2.0 migration, I've seen the same mistakes come up again and again. Here are the ten most common pitfalls, and how to avoid them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Treating It Like a Regular Composer Update
&lt;/h2&gt;

&lt;p&gt;Sylius 2.0 is not a minor version bump. Running &lt;code&gt;composer update&lt;/code&gt; and hoping for the best will leave you with a broken application. This is a full platform migration that touches templates, state machines, mailer, payments, and the frontend stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Treat it as a project in its own right with dedicated time, a fresh branch, and a proper test plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Ignoring Template Overrides Until the Last Minute
&lt;/h2&gt;

&lt;p&gt;Template overrides in &lt;code&gt;templates/bundles/SyliusShopBundle/&lt;/code&gt; are the single largest source of migration work. In Sylius 2.0, these overrides still work but are discouraged in favor of Twig Hooks. Many teams postpone this inventory and get blindsided by the volume of files they'll eventually want to convert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Run a full inventory of your template overrides &lt;em&gt;before&lt;/em&gt; estimating the migration effort. Each override can be kept as-is (with technical debt) or mapped to the new Twig Hook equivalent (the recommended path forward).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Assuming All Plugins Are Compatible
&lt;/h2&gt;

&lt;p&gt;Just because a plugin works on Sylius 1.x doesn't mean it has a 2.0 release. Plugin authors need to update their code for the new architecture, and many haven't done so yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Go through every Sylius plugin in your &lt;code&gt;composer.json&lt;/code&gt;. Check each one on the Sylius Addons marketplace and on GitHub. If a plugin doesn't have a 2.0-compatible version and no announced timeline, plan for a replacement or a fork.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Forgetting About winzou State Machine Callbacks
&lt;/h2&gt;

&lt;p&gt;If you've added custom callbacks to &lt;code&gt;winzou_state_machine&lt;/code&gt; configuration, those won't work with Symfony Workflow. The configuration format, event system, and guard mechanism are all different: guards move from service callbacks to Symfony's expression language, and callbacks become event subscribers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Search your config files for &lt;code&gt;winzou_state_machine&lt;/code&gt;. List every custom callback and transition guard. Each one needs to be rewritten as a Symfony Workflow event subscriber (or expression-language guard, for simple authorization checks).&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Not Testing Payment Flows
&lt;/h2&gt;

&lt;p&gt;Sylius 2.0 introduces Payment Requests as an experimental, event-driven payment architecture. In 2.0, Payum remains the default way to interact with payment gateways, so existing custom Payum gateways keep working, but any customization touching payment logic should be retested end-to-end after migration. Removed core gateways (like Stripe and PayPal Express Checkout, which are no longer shipped with Sylius by default) need particular attention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Audit your &lt;code&gt;Payum/&lt;/code&gt; directory and any custom gateway code. Check whether any gateway you rely on was removed from core. Test every payment scenario in your staging environment after migration, and don't assume it "just works."&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Underestimating the Frontend Migration
&lt;/h2&gt;

&lt;p&gt;Moving from Semantic UI + jQuery to Bootstrap 5 + Symfony UX (Turbo + Stimulus) isn't just swapping CSS classes. If your storefront has custom JavaScript interactions, modal behaviors, AJAX calls via jQuery, or custom Semantic UI components, each one needs to be rewritten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Inventory every &lt;code&gt;.js&lt;/code&gt; file and every template using Semantic UI classes. Estimate frontend work separately from backend work: they're often comparable in effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Migrating Everything at Once
&lt;/h2&gt;

&lt;p&gt;Trying to upgrade Symfony, Sylius, the frontend, and all plugins simultaneously creates a debugging nightmare. When something breaks, you won't know which change caused it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; If possible, first upgrade to the latest Sylius 1.x (1.14 LTS) on Symfony 6.4 LTS. Resolve all deprecations there. Then tackle the 2.0 migration as a separate step.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Skipping the Deprecation Log
&lt;/h2&gt;

&lt;p&gt;Symfony's deprecation layer exists for a reason. Running your Sylius 1.x app and checking the Symfony profiler's deprecation tab tells you exactly what deprecated APIs your code uses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Run your test suite with &lt;code&gt;SYMFONY_DEPRECATIONS_HELPER=strict&lt;/code&gt; in PHPUnit. Fix every deprecation &lt;em&gt;before&lt;/em&gt; starting the 2.0 migration. This removes an entire class of surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. No Migration Roadmap
&lt;/h2&gt;

&lt;p&gt;Starting the migration without a structured plan leads to scope creep, blocked developers, and missed deadlines. Migration touches every layer of the application, so it needs coordination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Break the migration into phases: audit, deprecation fixes, backend migration, frontend migration, plugin updates, QA. Assign owners and timelines to each phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Doing the Entire Audit Manually
&lt;/h2&gt;

&lt;p&gt;Manually checking every template override, every deprecated service, every plugin version, and every frontend dependency across a large project is slow and error-prone. Important issues get missed, effort estimates are inaccurate, and stakeholders don't get a clear picture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Use Sylius Upgrade Analyzer to automate the audit. It scans your project locally with 49 analyzers organized into 6 thematic families (Templates &amp;amp; Frontend, Deprecations &amp;amp; Breaking Changes, Plugins, Grid &amp;amp; Resource, API Platform, Security), and produces a structured report with effort estimations in hours. The CLI is open-source and your code stays on your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Not Communicating the Effort to Stakeholders
&lt;/h2&gt;

&lt;p&gt;Migration isn't just a developer concern. Product managers, project managers, and clients need to understand that this will take dedicated time and may temporarily slow feature delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Produce a clear, visual migration report. A PDF with a complexity score, a breakdown by category, and hour estimates speaks louder than a verbal "it'll take a while." This is exactly the kind of deliverable Sylius Upgrade Analyzer generates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need help with your migration?
&lt;/h2&gt;

&lt;p&gt;Developed by Pierre-Arthur Demengel, freelance developer specialised in Sylius 1.x to 2.x migrations. Need help migrating your store? &lt;strong&gt;&lt;a href="https://creation-site-pro.fr/en/sylius-2-upgrade?utm_source=devto" rel="noopener noreferrer"&gt;Get a free diagnosis&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>sylius</category>
      <category>symfony</category>
      <category>php</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Migrating Sylius 1.x to 2.0: A Complete Guide</title>
      <dc:creator>Pierre-Arthur DEMENGEL</dc:creator>
      <pubDate>Sat, 11 Apr 2026 20:18:32 +0000</pubDate>
      <link>https://dev.to/pierrearthurdemengel/migrating-sylius-1x-to-20-a-complete-guide-4kfb</link>
      <guid>https://dev.to/pierrearthurdemengel/migrating-sylius-1x-to-20-a-complete-guide-4kfb</guid>
      <description>&lt;p&gt;Sylius 2.0 is the most significant release since the framework's inception. If you're running a Sylius 1.x store in production, migration is no longer a question of &lt;em&gt;if&lt;/em&gt; but &lt;em&gt;when&lt;/em&gt;. This guide walks you through every major area of change, so you can plan your upgrade with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Sylius 2.0 Is a Major Shift
&lt;/h2&gt;

&lt;p&gt;Sylius 2.0 isn't a simple &lt;code&gt;composer update&lt;/code&gt;. The core team has modernized the entire stack. Here's what's changing at a high level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Semantic UI + jQuery are gone, replaced by Bootstrap 5 + Symfony UX (Turbo, Stimulus)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Templates&lt;/strong&gt;: &lt;strong&gt;Twig Hooks&lt;/strong&gt; becomes the recommended customization approach, replacing the old template override pattern (still functional but discouraged)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State machines&lt;/strong&gt;: &lt;code&gt;winzou/state-machine-bundle&lt;/code&gt; is replaced by &lt;strong&gt;Symfony Workflow&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mailer&lt;/strong&gt;: SwiftMailer is out, &lt;code&gt;symfony/mailer&lt;/code&gt; is in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: the Payum-based flow is being complemented by the new &lt;strong&gt;Payment Requests&lt;/strong&gt; system (experimental in 2.0), which will progressively replace Payum in upcoming minor versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API&lt;/strong&gt;: API Platform 2.7 migrates to API Platform 4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these is a migration project in itself. Combined, they can represent weeks or months of work depending on how heavily your project has customized the default Sylius behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Get to Sylius 1.14 First
&lt;/h2&gt;

&lt;p&gt;If your project is on Sylius 1.12 or 1.13, upgrade to 1.14 (the LTS version) first. The official Sylius migration guide recommends this as a prerequisite: it smooths out intermediate deprecations and aligns your codebase with the latest 1.x APIs before tackling the 2.0 jump.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Audit Your Template Overrides
&lt;/h2&gt;

&lt;p&gt;The biggest source of migration effort for most projects is &lt;strong&gt;Twig template overrides&lt;/strong&gt;. If you've overridden 5 templates, it's manageable. If you've overridden 80, you're looking at a significant effort.&lt;/p&gt;

&lt;p&gt;In Sylius 1.x, you customize the storefront by placing template overrides in &lt;code&gt;templates/bundles/SyliusShopBundle/&lt;/code&gt;. In 2.0, overrides still work but are discouraged in favor of Twig Hooks, where you register small, composable template fragments at specific extension points instead of copying entire files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;List every template you've overridden in &lt;code&gt;templates/bundles/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;For each override, identify &lt;em&gt;what&lt;/em&gt; you changed (often it's just a few lines)&lt;/li&gt;
&lt;li&gt;Map each change to the equivalent Twig Hook in Sylius 2.0&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This mapping exercise is the most time-consuming part of the audit. Each overridden template needs to be analyzed individually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Handle Deprecated Components
&lt;/h2&gt;

&lt;h3&gt;
  
  
  winzou State Machine → Symfony Workflow
&lt;/h3&gt;

&lt;p&gt;If you've defined custom state machine callbacks or transitions, you'll need to rewrite them as Symfony Workflow event subscribers. The configuration format is completely different.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;winzou_state_machine&lt;/code&gt; configuration keys in your YAML files&lt;/li&gt;
&lt;li&gt;Custom callback classes&lt;/li&gt;
&lt;li&gt;Any service that injects &lt;code&gt;StateMachineInterface&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: the &lt;code&gt;winzou/state-machine-bundle&lt;/code&gt; package has been moved to the suggested dependencies in Sylius 2.0 and can still be installed manually if needed, but the core Sylius workflows have all migrated to Symfony Workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  SwiftMailer → symfony/mailer
&lt;/h3&gt;

&lt;p&gt;This is usually one of the easier migrations. The &lt;code&gt;swiftmailer/swiftmailer&lt;/code&gt; dependency has been completely removed (the library itself was abandoned by its maintainers in 2021). Search for &lt;code&gt;\Swift_Message&lt;/code&gt;, &lt;code&gt;\Swift_Mailer&lt;/code&gt;, and any SwiftMailer-specific configuration, and replace with &lt;code&gt;symfony/mailer&lt;/code&gt; equivalents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Payum and Payment Requests
&lt;/h3&gt;

&lt;p&gt;Sylius 2.0 introduces Payment Requests as an experimental, event-driven payment architecture on top of Symfony Messenger. In 2.0, Payum is still available and remains the default way to interact with payment gateways: Payment Requests is designed to work alongside it and progressively replace it in upcoming minor versions. If you've written custom Payum gateways, they keep working, but you can start exploring Payment Requests for new gateways or headless scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Check Plugin Compatibility
&lt;/h2&gt;

&lt;p&gt;This is a critical and often overlooked step. Every third-party Sylius plugin you use needs to be compatible with Sylius 2.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For each plugin in your &lt;code&gt;composer.json&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check if the plugin has a 2.x-compatible release&lt;/li&gt;
&lt;li&gt;If not, check the plugin's GitHub issues for migration plans&lt;/li&gt;
&lt;li&gt;If no plans exist, you may need to fork the plugin or find an alternative&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The status varies plugin by plugin: some (like several BitBag plugins) already have stable 2.x releases, others are still being ported, and a few smaller community plugins have no announced timeline. Always check the plugin's Packagist page and GitHub repo directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Frontend Migration
&lt;/h2&gt;

&lt;p&gt;If you've customized the storefront's CSS or JavaScript, you'll need to migrate from Semantic UI to Bootstrap 5. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replacing Semantic UI CSS classes (&lt;code&gt;ui button&lt;/code&gt;, &lt;code&gt;ui grid&lt;/code&gt;, etc.) with Bootstrap equivalents&lt;/li&gt;
&lt;li&gt;Rewriting any jQuery code as Stimulus controllers&lt;/li&gt;
&lt;li&gt;Updating your Webpack Encore configuration (Sylius 2.0 still uses Webpack Encore, with new asset organization)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your project uses a fully custom frontend (headless), this step may not apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: API Platform Migration
&lt;/h2&gt;

&lt;p&gt;If you use Sylius's API, you'll need to update from API Platform 2.7 to 4. The concrete changes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serialization groups are now prefixed with &lt;code&gt;sylius:&lt;/code&gt; (e.g., &lt;code&gt;admin:product:index&lt;/code&gt; becomes &lt;code&gt;sylius:admin:product:index&lt;/code&gt;). Non-prefixed groups have been removed, so every custom resource extending Sylius groups needs to be updated.&lt;/li&gt;
&lt;li&gt;DataProviders become StateProviders and DataPersisters become StateProcessors, following API Platform 4's provider/processor pattern. Namespaces change accordingly: classes under &lt;code&gt;Sylius\Bundle\ApiBundle\DataProvider&lt;/code&gt; move to &lt;code&gt;Sylius\Bundle\ApiBundle\StateProvider&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;DataTransformers are gone, some refactored into SerializerContextBuilders.&lt;/li&gt;
&lt;li&gt;Resource configuration files use a new XML schema (&lt;code&gt;metadata/resources-3.0&lt;/code&gt;; note that the "3.0" refers to the schema version, not API Platform's major version).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Estimating the Effort
&lt;/h2&gt;

&lt;p&gt;From experience, here's a rough estimation framework:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project Type&lt;/th&gt;
&lt;th&gt;Customization Level&lt;/th&gt;
&lt;th&gt;Estimated Effort&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Light customization&lt;/td&gt;
&lt;td&gt;&amp;lt; 10 template overrides, no custom plugins&lt;/td&gt;
&lt;td&gt;2 to 5 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium customization&lt;/td&gt;
&lt;td&gt;10 to 30 overrides, 2 to 5 plugins, custom state machines&lt;/td&gt;
&lt;td&gt;2 to 4 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy customization&lt;/td&gt;
&lt;td&gt;30+ overrides, custom payment gateways, heavy JS&lt;/td&gt;
&lt;td&gt;1 to 3 months&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These estimates cover application code migration only. Add time for infrastructure updates (PHP 8.2+ runtime, Node.js 20 or 22), full regression QA, and stakeholder coordination.&lt;/p&gt;

&lt;p&gt;The key variables are: number of template overrides, number of deprecated API usages, and plugin compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automating the Audit
&lt;/h2&gt;

&lt;p&gt;Doing this analysis manually for each project is tedious and error-prone. That's exactly why I built &lt;a href="https://github.com/pierrearthurdemengel/sylius-upgrade-analyzer" rel="noopener noreferrer"&gt;Sylius Upgrade Analyzer&lt;/a&gt;: a CLI tool that scans your Sylius 1.x project and produces a detailed migration report. It checks template overrides, deprecated components, plugin compatibility, frontend dependencies, and calculates an effort estimation in hours.&lt;/p&gt;

&lt;p&gt;The CLI is open-source (MIT license) and runs entirely on your machine, so your code never leaves your environment. PDF reports for stakeholders are generated locally, for free (&lt;code&gt;--format=pdf&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start the audit now&lt;/strong&gt;, even if you're not ready to migrate yet. Understanding the scope early avoids surprises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template overrides are the biggest risk factor.&lt;/strong&gt; Focus your assessment there first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check plugin compatibility before committing to a timeline.&lt;/strong&gt; A single incompatible plugin can block the entire migration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate what you can.&lt;/strong&gt; Manual auditing across dozens of files is where mistakes happen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sylius 2.0 is a major leap forward for the platform. The migration effort is real, but the result is a more modern, maintainable stack compatible with Symfony 6.4 LTS and Symfony 7. Plan ahead, and you'll get there smoothly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need help with your migration?
&lt;/h2&gt;

&lt;p&gt;Developed by Pierre-Arthur Demengel, freelance developer specialised in Sylius 1.x to 2.x migrations. Need help migrating your store? &lt;strong&gt;&lt;a href="https://creation-site-pro.fr/en/sylius-2-upgrade?utm_source=devto" rel="noopener noreferrer"&gt;Get a free diagnosis&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>sylius</category>
      <category>symfony</category>
      <category>php</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Sylius 1.x end of support is coming, so I built a CLI to audit your migration to 2.x</title>
      <dc:creator>Pierre-Arthur DEMENGEL</dc:creator>
      <pubDate>Mon, 06 Apr 2026 06:04:36 +0000</pubDate>
      <link>https://dev.to/pierrearthurdemengel/sylius-1x-end-of-support-is-coming-so-i-built-a-cli-to-audit-your-migration-to-2x-2nii</link>
      <guid>https://dev.to/pierrearthurdemengel/sylius-1x-end-of-support-is-coming-so-i-built-a-cli-to-audit-your-migration-to-2x-2nii</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update, November 2026 (v2.5):&lt;/strong&gt; every auto-fixer was replayed on real input and every rule checked against the Sylius 1.14 and 2.0 sources; wrong rules were corrected or removed, and each fixer now has a documented before/after example. Since v2.4 the tool also runs from a Docker image or a standalone PHAR, so it works whatever your project's PHP version. It is fully local and free, PDF reports included, every detection was re-checked against the official Sylius 2.0 sources, and it has been run on public Sylius projects (results below).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you maintain a Sylius 1.x project in production, you already know what's coming. Sylius 1.14 is the final 1.x release: its maintenance ended in December 2025 and its &lt;strong&gt;security support ends in December 2026&lt;/strong&gt; (&lt;a href="https://docs.sylius.com/public/open-source/release-cycle" rel="noopener noreferrer"&gt;official release cycle&lt;/a&gt;). Every shop still running on 1.x will have to migrate to 2.x.&lt;/p&gt;

&lt;p&gt;The official Sylius plugin migration guide is still tagged "WIP/experimental" on docs.sylius.com, and the scope of the upgrade is massive: Bootstrap + Symfony UX replacing Semantic UI + jQuery, Twig Hooks replacing template overrides, Symfony Workflow replacing winzou, &lt;code&gt;symfony/mailer&lt;/code&gt; replacing SwiftMailer, Payment Requests introduced alongside Payum, API Platform 4 replacing API Platform 2.7, plus a long list of removed classes, renamed services, and dropped routes.&lt;/p&gt;

&lt;p&gt;Every agency and every lead developer facing this migration does the same thing: open the project, manually dig through every overridden Twig template, check &lt;code&gt;composer.json&lt;/code&gt; plugins one by one against the Marketplace, grep for jQuery calls, count Semantic UI classes, read through &lt;code&gt;UPGRADE-2.0.md&lt;/code&gt; line by line. It takes days and the result is an approximate spreadsheet at best.&lt;/p&gt;

&lt;p&gt;I found that unacceptable, so I built the tool that was missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Sylius Upgrade Analyzer
&lt;/h2&gt;

&lt;p&gt;Sylius Upgrade Analyzer is an open-source CLI tool that scans a Sylius 1.x project and produces a full migration diagnostic in seconds. From the root of your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/project"&lt;/span&gt; ghcr.io/pierrearthurdemengel/sylius-upgrade-analyzer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No configuration needed, and nothing is installed in your project. It detects your Sylius version from &lt;code&gt;composer.lock&lt;/code&gt; (or from &lt;code&gt;composer.json&lt;/code&gt; when no lock is committed) and runs every analyzer against your codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Supports every Sylius 1.x release, from 1.0 to 1.14 LTS (the final 1.x version).&lt;/strong&gt; There is no Sylius 1.15 or 1.16. The default migration target is Sylius 2.2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works whatever your project's PHP version.&lt;/strong&gt; The Docker image ships its own PHP, so a shop still on PHP 7.4 or Symfony 5.4 can be audited as is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Pick the mode that fits. The first three never touch your project's &lt;code&gt;composer.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Docker (recommended): any project PHP version, all formats including PDF&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/project"&lt;/span&gt; ghcr.io/pierrearthurdemengel/sylius-upgrade-analyzer

&lt;span class="c"&gt;# 2. Standalone PHAR: a single file, needs PHP 8.2+ on the machine running it (no PDF)&lt;/span&gt;
curl &lt;span class="nt"&gt;-LO&lt;/span&gt; https://github.com/pierrearthurdemengel/sylius-upgrade-analyzer/releases/latest/download/sylius-upgrade-analyzer.phar
php sylius-upgrade-analyzer.phar sylius-upgrade:analyze /path/to/project

&lt;span class="c"&gt;# 3. Global Composer install&lt;/span&gt;
composer global require pierre-arthur/sylius-upgrade-analyzer

&lt;span class="c"&gt;# 4. Inside the project, only if it already runs PHP 8.2+ with Symfony 6.4 or 7.x&lt;/span&gt;
composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; pierre-arthur/sylius-upgrade-analyzer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The examples below use &lt;code&gt;vendor/bin/sylius-upgrade-analyzer&lt;/code&gt;; with Docker, replace it with &lt;code&gt;docker run --rm -v "$PWD:/project" ghcr.io/pierrearthurdemengel/sylius-upgrade-analyzer&lt;/code&gt; and pass &lt;code&gt;/project&lt;/code&gt; as the path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Covers
&lt;/h2&gt;

&lt;p&gt;The tool ships with &lt;strong&gt;49 built-in analyzers&lt;/strong&gt; organized across &lt;strong&gt;6 thematic families&lt;/strong&gt;, all built from the official &lt;code&gt;UPGRADE-2.0.md&lt;/code&gt;, &lt;code&gt;UPGRADE-API-2.0.md&lt;/code&gt;, and &lt;code&gt;CHANGELOG-2.0.md&lt;/code&gt;. Nothing is guessed, everything is sourced: detections that could not be traced back to a documented Sylius 2.0 change have been removed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Templates &amp;amp; Frontend.&lt;/strong&gt; Overridden Sylius templates that should migrate to Twig Hooks, &lt;code&gt;sonata_block_render_event&lt;/code&gt; and &lt;code&gt;sylius_template_event&lt;/code&gt; calls to replace with &lt;code&gt;hook()&lt;/code&gt;, Semantic UI CSS classes still present in templates, jQuery and Semantic UI JS usage in assets, and &lt;code&gt;webpack.config.js&lt;/code&gt; with &lt;code&gt;@symfony/webpack-encore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Deprecations &amp;amp; Breaking Changes.&lt;/strong&gt; winzou state machine to Symfony Workflow, SwiftMailer to &lt;code&gt;symfony/mailer&lt;/code&gt;, legacy user encoders to &lt;code&gt;password_hashers&lt;/code&gt;, Payum gateways convertible to Payment Requests (optional: Payum is still supported in 2.0), message bus renames, the &lt;code&gt;Message*&lt;/code&gt; namespaces of Sylius bundles renamed &lt;code&gt;Command*&lt;/code&gt;, removed email managers, removed Stripe and PayPal Express Checkout gateways, service decorator targets, order processors and cart contexts no longer registered through their interface, form type extensions removed from the core, the removed &lt;code&gt;api_security&lt;/code&gt; Behat service, listeners on the five removed admin menus, promotion rules, renamed shipping calculator services, Doctrine XML mapping to PHP attributes, fixture changes, the removed &lt;code&gt;findOneByHostname()&lt;/code&gt; channel lookup, bundle configuration changes, &lt;code&gt;sylius/calendar&lt;/code&gt; to &lt;code&gt;symfony/clock&lt;/code&gt;, security firewall renames, removed user model fields, removed classes (150+), renamed service IDs, removed routes, LiipImagine config changes, changed constructor signatures, grid filter syntax changes, removed &lt;code&gt;use_webpack&lt;/code&gt; config, PHP and Node version requirements, moved classes between bundles, service visibility changes, missing payment request env vars, and removed deprecated bundle packages like FOSRest and JMSSerializer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Plugins.&lt;/strong&gt; Cross-references every Sylius plugin in your &lt;code&gt;composer.json&lt;/code&gt; against the Addons Marketplace API and Packagist to determine compatibility with 2.x, evaluating version constraints as real version ranges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Grid &amp;amp; Resource.&lt;/strong&gt; Custom grid YAML/PHP customizations (custom field types, filters and action templates), resource bundle config, repositories extending Sylius ones, service overrides in YAML and XML, grid filter entity syntax changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. API Platform.&lt;/strong&gt; Namespace changes, serialization group prefixes, endpoint restructuring, and query extension signature changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Security.&lt;/strong&gt; The PHP version your project declares (Dockerfile, compose files, &lt;code&gt;config.platform.php&lt;/code&gt;, &lt;code&gt;.php-version&lt;/code&gt;, &lt;code&gt;.tool-versions&lt;/code&gt;) is compared with the latest security releases. Runtimes below PHP 8.2.35, 8.3.36, 8.4.27 or 8.5.12 are exposed to CVE-2026-109618 and CVE-2026-109619, actively exploited remote code execution, and are reported as breaking.&lt;/p&gt;

&lt;p&gt;Each issue is classified as &lt;code&gt;BREAKING&lt;/code&gt;, &lt;code&gt;WARNING&lt;/code&gt;, or &lt;code&gt;SUGGESTION&lt;/code&gt;, with a time estimate in hours and a direct link to the relevant documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto-fix
&lt;/h2&gt;

&lt;p&gt;Detection is useful but fixing is better. The tool includes &lt;strong&gt;37 auto-fixers&lt;/strong&gt; that can apply the most common corrections automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vendor/bin/sylius-upgrade-analyzer sylius-upgrade:analyze &lt;span class="nt"&gt;--fix&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--dry-run&lt;/code&gt; flag generates a unified diff patch showing what would change without touching any files. When you're confident, drop the flag: in a terminal, the tool shows the full patch and asks for confirmation before writing anything (in CI it applies directly).&lt;/p&gt;

&lt;p&gt;Fixers only rewrite files of your project: none of them connects to a database, runs a migration or executes a command, and none edits PHP payment code (the payment-related fixers only comment out obsolete YAML or add missing environment variables). Run it on a clean Git working tree and &lt;code&gt;git diff&lt;/code&gt; shows exactly what changed.&lt;/p&gt;

&lt;p&gt;Each fixer has a confidence level. &lt;code&gt;HIGH&lt;/code&gt; means a rename or removal documented one-to-one in the official guides, like &lt;code&gt;security.encoders&lt;/code&gt; to &lt;code&gt;security.password_hashers&lt;/code&gt; or a renamed service ID. &lt;code&gt;MEDIUM&lt;/code&gt; means correct but worth a check, like workflow migration or Sonata block event replacement. &lt;code&gt;LOW&lt;/code&gt; is a starting point only. Use &lt;code&gt;--min-confidence=high&lt;/code&gt; to apply only the safe ones. Every fixer's real before/after output is in &lt;a href="https://github.com/pierrearthurdemengel/sylius-upgrade-analyzer/blob/main/docs/fixer-examples.md" rel="noopener noreferrer"&gt;docs/fixer-examples.md&lt;/a&gt;, replayed by the test suite on every run.&lt;/p&gt;

&lt;p&gt;Among the 37 fixers: Twig Hook YAML generation, winzou to Symfony Workflow conversion, SwiftMailer to &lt;code&gt;symfony/mailer&lt;/code&gt; rewrite, renamed service IDs, security firewall renames, LiipImagine config, Sonata block events to &lt;code&gt;hook()&lt;/code&gt;, grid filter entity syntax, calendar-to-clock replacement, bundle config updates, deprecated package removal, routing import fixes, removed config keys, API namespace updates, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Output Formats
&lt;/h2&gt;

&lt;p&gt;The CLI supports six output formats depending on your workflow: Console (the default, with a colored ASCII gauge, severity breakdown and category table), JSON (machine-readable, for CI/CD integration), CSV (Excel-compatible with UTF-8 BOM and semicolon separator), SARIF (GitHub Code Scanning compatible), Markdown (human-readable, suitable for PRs and wikis), and PDF (detailed below).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vendor/bin/sylius-upgrade-analyzer sylius-upgrade:analyze &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;report.json

vendor/bin/sylius-upgrade-analyzer sylius-upgrade:analyze &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sarif &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;report.sarif

vendor/bin/sylius-upgrade-analyzer sylius-upgrade:analyze &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csv &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;report.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PDF Reports
&lt;/h2&gt;

&lt;p&gt;The PDF report is generated locally, for free, and nothing leaves your machine. It is meant for decision makers: executive summary, risk factors, migration roadmap, detailed blocking issues, and an optional budget estimate based on your daily rate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Included in the Docker image; with Composer installs, add dompdf first&lt;/span&gt;
composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; dompdf/dompdf

vendor/bin/sylius-upgrade-analyzer sylius-upgrade:analyze &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pdf &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;report.pdf &lt;span class="nt"&gt;--tjm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;600
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The budget converts the estimated hours into days on a 7-hour basis, rounded up to the next half day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Project Analysis
&lt;/h2&gt;

&lt;p&gt;Agencies maintaining several Sylius shops can audit them in one run and get a comparison table (complexity, risk, blocking issues, hours, budget) with totals, as console output, JSON, Markdown or a consolidated PDF.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vendor/bin/sylius-upgrade-analyzer sylius-upgrade:multi-analyze &lt;span class="se"&gt;\&lt;/span&gt;
  /path/to/shop-fr /path/to/shop-de &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pdf &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;portfolio.pdf &lt;span class="nt"&gt;--tjm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;600
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  GitHub Action
&lt;/h2&gt;

&lt;p&gt;The analyzer runs in CI too. Add it to your workflow and it can fail on breaking issues, upload SARIF to GitHub Code Scanning, and post a summary comment on pull requests. The analyzer is installed outside your project, so your &lt;code&gt;composer.json&lt;/code&gt; is left untouched.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
  &lt;span class="na"&gt;security-events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;   &lt;span class="c1"&gt;# upload-sarif&lt;/span&gt;
  &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;     &lt;span class="c1"&gt;# post-pr-comment&lt;/span&gt;

&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pierrearthurdemengel/sylius-upgrade-analyzer@v2.4.0&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;project-path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.'&lt;/span&gt;
      &lt;span class="na"&gt;target-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2.2'&lt;/span&gt;
      &lt;span class="na"&gt;fail-on-breaking&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;true'&lt;/span&gt;
      &lt;span class="na"&gt;upload-sarif&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;true'&lt;/span&gt;
      &lt;span class="na"&gt;post-pr-comment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;true'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional Features
&lt;/h2&gt;

&lt;p&gt;The CLI also supports custom rules via a &lt;code&gt;.sylius-upgrade-rules.yaml&lt;/code&gt; file at the root of your project, baseline management to save and diff results across runs, sprint planning with configurable team velocity, a plugin compatibility matrix, and report comparison to track migration progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results on Public Projects
&lt;/h2&gt;

&lt;p&gt;To check its findings against reality, the analyzer is run on public Sylius 1.x code bases, and every blocking issue is reviewed by hand:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Issues&lt;/th&gt;
&lt;th&gt;Blocking&lt;/th&gt;
&lt;th&gt;Estimated effort&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/Sylius/Sylius-Standard" rel="noopener noreferrer"&gt;Sylius-Standard&lt;/a&gt; 1.14 (official skeleton)&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;52.0 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/Sylius/InvoicingPlugin" rel="noopener noreferrer"&gt;Sylius/InvoicingPlugin&lt;/a&gt; 1.0&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;38.5 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/BitBagCommerce/SyliusWishlistPlugin" rel="noopener noreferrer"&gt;BitBag SyliusWishlistPlugin&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;15.5 h&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even an untouched skeleton needs real work. These runs also caught and fixed false positives in the analyzer itself. Details and reproduction commands are in &lt;a href="https://github.com/pierrearthurdemengel/sylius-upgrade-analyzer/blob/main/docs/benchmarks.md" rel="noopener noreferrer"&gt;docs/benchmarks.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/pierrearthurdemengel/sylius-upgrade-analyzer" rel="noopener noreferrer"&gt;github.com/pierrearthurdemengel/sylius-upgrade-analyzer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Packagist: &lt;a href="https://packagist.org/packages/pierre-arthur/sylius-upgrade-analyzer" rel="noopener noreferrer"&gt;pierre-arthur/sylius-upgrade-analyzer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sylius 1.x security support ends in December 2026. If you have projects to migrate, give it a try and let me know what's missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need help with your migration?
&lt;/h2&gt;

&lt;p&gt;Developed by Pierre-Arthur Demengel, freelance developer specialised in Sylius 1.x to 2.x migrations. Need help migrating your store? &lt;strong&gt;&lt;a href="https://creation-site-pro.fr/en/sylius-2-upgrade?utm_source=devto" rel="noopener noreferrer"&gt;Get a free diagnosis&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>symfony</category>
      <category>sylius</category>
    </item>
  </channel>
</rss>
