{"id":523083,"date":"2026-02-09T06:19:41","date_gmt":"2026-02-09T06:19:41","guid":{"rendered":"https:\/\/webkul.com\/blog\/?p=523083"},"modified":"2026-02-13T09:57:24","modified_gmt":"2026-02-13T09:57:24","slug":"prestashop-bo-controllers-legacy-to-symfony","status":"publish","type":"post","link":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/","title":{"rendered":"PrestaShop Back Office Controllers: Legacy to Symfony"},"content":{"rendered":"\n<p>A developer can migrate PrestaShop Back Office controllers from legacy to Symfony by building a demo module <code><strong>wkdemomodule<\/strong><\/code> with a simple create, save, and list form.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Migrating PrestaShop legacy Controllers to Symfony<\/strong><\/h4>\n\n\n\n<p>From PrestaShop 1.7, the Back Office uses Symfony. Migrating legacy module controllers to Symfony provides clean routing, dependency injection, and reusable Twig templates for easier maintenance.<\/p>\n\n\n\n<p>We will create <strong>wkdemomodule<\/strong>, featuring a Symfony-based grid (list) and a form to manage custom data.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>1. Module Structure<\/strong><\/h4>\n\n\n\n<p>Your module folder should look like this:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">wkdemomodule\/\n\u251c\u2500\u2500 config\/\n\u2502   \u2514\u2500\u2500 routes.yml\n\u251c\u2500\u2500 src\/\n\u2502   \u2514\u2500\u2500 Controller\/\n\u2502       \u2514\u2500\u2500 Admin\/\n\u2502           \u2514\u2500\u2500 DemoController.php\n\u251c\u2500\u2500 views\/\n\u2502   \u2514\u2500\u2500 templates\/\n\u2502       \u2514\u2500\u2500 admin\/\n\u2502           \u2514\u2500\u2500 demo\/\n\u2502               \u251c\u2500\u2500 index.html.twig\n\u2502               \u2514\u2500\u2500 form.html.twig\n\u251c\u2500\u2500 wkdemomodule.php\n\u2514\u2500\u2500 composer.json<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1079\" height=\"479\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp\" alt=\"Module structure\" class=\"wp-image-524783\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp 1079w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure-300x133.webp 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure-250x111.webp 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure-768x341.webp 768w\" sizes=\"(max-width: 1079px) 100vw, 1079px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">2. <strong>Setting up Autoloading<\/strong><\/h4>\n\n\n\n<p>In your <strong>composer.json<\/strong>, define the namespace for your <strong>src<\/strong> directory:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">{\n  &quot;name&quot;: &quot;wk\/wkdemomodule&quot;,\n  &quot;type&quot;: &quot;prestashop-module&quot;,\n  &quot;autoload&quot;: {\n    &quot;psr-4&quot;: {\n      &quot;WkDemoModule\\\\&quot;: &quot;src\/&quot;\n    }\n  },\n  &quot;config&quot;: {\n    &quot;prepend-autoloader&quot;: false\n  }\n}<\/pre>\n\n\n\n<p>After creating the file, run <code><strong>composer dump-autoload<\/strong><\/code> to refresh the autoloader.<\/p>\n\n\n\n<p>After running the command, the <code>vendor<\/code> A folder is created inside the module directory.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. <strong>Defining Symfony Routes<\/strong><\/h4>\n\n\n\n<p>Create <strong>config\/routes.yml<\/strong>. This tells PrestaShop which URL maps to your Symfony controller.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">wk_demo_list:\n  path: \/wk-demo\/list\n  methods: &#091;GET]\n  defaults:\n    _controller: &#039;WkDemoModule\\Controller\\Admin\\DemoController::indexAction&#039;\n    _legacy_classname: AdminWkDemo\n    _legacy_module_name: wkdemomodule\n\nwk_demo_create:\n  path: \/wk-demo\/create\n  methods: &#091;GET, POST]\n  defaults:\n    _controller: &#039;WkDemoModule\\Controller\\Admin\\DemoController::createAction&#039;\n    _legacy_classname: AdminWkDemo\n    _legacy_module_name: wkdemomodule\n    \nwk_demo_edit:\n  path: \/wk-demo\/edit\/{id}\n  methods: &#091;GET, POST]\n  defaults:\n    _controller: &#039;WkDemoModule\\Controller\\Admin\\DemoController::editAction&#039;\n    _legacy_classname: AdminWkDemo\n    _legacy_module_name: wkdemomodule<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">4. <strong>The Symfony Controller<\/strong><\/h4>\n\n\n\n<p>Create <strong>src\/Controller\/Admin\/DemoController.php<\/strong>. This controller will handle the logic for displaying the list and saving the form.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">&lt;?php\n\nnamespace WkDemoModule\\Controller\\Admin;\n\nuse PrestaShopBundle\\Controller\\Admin\\FrameworkBundleAdminController;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nclass DemoController extends FrameworkBundleAdminController\n{\n    public function indexAction(): Response\n    {\n        $data = $this-&gt;getDemoData();\n\n        return $this-&gt;render(\n            &#039;@Modules\/wkdemomodule\/views\/templates\/admin\/demo\/index.html.twig&#039;,\n            &#091;\n                &#039;gridData&#039; =&gt; $data,\n                &#039;layoutHeaderToolbarBtn&#039; =&gt; &#091;\n                    &#039;add&#039; =&gt; &#091;\n                        &#039;href&#039; =&gt; $this-&gt;generateUrl(&#039;wk_demo_create&#039;),\n                        &#039;desc&#039; =&gt; $this-&gt;trans(&#039;Add New&#039;, &#039;Modules.Wkdemomodule.Admin&#039;),\n                        &#039;icon&#039; =&gt; &#039;add_circle_outline&#039;,\n                    ],\n                ],\n            ]\n        );\n    }\n\n    public function createAction(Request $request): Response\n    {\n        if ($request-&gt;isMethod(&#039;POST&#039;)) {\n            $name = $request-&gt;request-&gt;get(&#039;demo_name&#039;);\n\n            \/\/ Normally you would save data here\n            \/\/ This is kept simple for demo purposes\n\n            $this-&gt;addFlash(\n                &#039;success&#039;,\n                $this-&gt;trans(&#039;Item created successfully.&#039;, &#039;Admin.Notifications.Success&#039;)\n            );\n\n            return $this-&gt;redirectToRoute(&#039;wk_demo_list&#039;);\n        }\n\n        return $this-&gt;render(\n            &#039;@Modules\/wkdemomodule\/views\/templates\/admin\/demo\/form.html.twig&#039;\n        );\n    }\n\n    public function editAction(Request $request, int $id): Response\n    {\n        $data = $this-&gt;getDemoData();\n\n        if (!isset($data&#091;$id])) {\n            throw $this-&gt;createNotFoundException(&#039;Item not found&#039;);\n        }\n\n        $item = $data&#091;$id];\n\n        if ($request-&gt;isMethod(&#039;POST&#039;)) {\n            $name = $request-&gt;request-&gt;get(&#039;demo_name&#039;);\n\n            \/\/ Demo update logic (normally DB update here)\n            $item&#091;&#039;name&#039;] = $name;\n\n            $this-&gt;addFlash(\n                &#039;success&#039;,\n                $this-&gt;trans(&#039;Item updated successfully.&#039;, &#039;Admin.Notifications.Success&#039;)\n            );\n\n            return $this-&gt;redirectToRoute(&#039;wk_demo_list&#039;);\n        }\n\n        return $this-&gt;render(\n            &#039;@Modules\/wkdemomodule\/views\/templates\/admin\/demo\/form.html.twig&#039;,\n            &#091;\n                &#039;demoItem&#039; =&gt; $item,\n                &#039;isEdit&#039; =&gt; true,\n            ]\n        );\n    }\n\n    private function getDemoData()\n    {\n        return &#091;\n            1 =&gt; &#091;&#039;id&#039; =&gt; 1, &#039;name&#039; =&gt; &#039;Demo Item 1&#039;, &#039;status&#039; =&gt; &#039;Active&#039;],\n            2 =&gt; &#091;&#039;id&#039; =&gt; 2, &#039;name&#039; =&gt; &#039;Demo Item 2&#039;, &#039;status&#039; =&gt; &#039;Inactive&#039;],\n        ];\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5. <strong>Main Module<\/strong> file<\/h4>\n\n\n\n<p>In <strong>wkdemomodule.php<\/strong>, you must register the tab so it appears in the Back Office menu, linking it to your Symfony route.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">&lt;?php\n\nif (!defined(&#039;_PS_VERSION_&#039;)) {\n    exit;\n}\n\nclass WkDemoModule extends Module\n{\n    public function __construct()\n    {\n        $this-&gt;name = &#039;wkdemomodule&#039;;\n        $this-&gt;tab = &#039;administration&#039;;\n        $this-&gt;version = &#039;1.0.0&#039;;\n        $this-&gt;author = &#039;WK&#039;;\n        $this-&gt;bootstrap = true;\n\n        parent::__construct();\n\n        $this-&gt;displayName = $this-&gt;l(&#039;WK Demo Module&#039;);\n        $this-&gt;description = $this-&gt;l(&#039;Demo module using Symfony Back Office controller.&#039;);\n    }\n\n    public function install()\n    {\n        return parent::install() &amp;&amp; $this-&gt;installTab();\n    }\n\n    public function uninstall()\n    {\n        return parent::uninstall() &amp;&amp; $this-&gt;uninstallTab();\n    }\n\n    private function installTab()\n    {\n        $tab = new Tab();\n        $tab-&gt;active = 1;\n        $tab-&gt;class_name = &#039;AdminWkDemo&#039;;\n        $tab-&gt;route_name = &#039;wk_demo_list&#039;;\n        $tab-&gt;module = $this-&gt;name;\n        $tab-&gt;id_parent = (int) Tab::getIdFromClassName(&#039;AdminParentCustomer&#039;);\n\n        foreach (Language::getLanguages(true) as $lang) {\n            $tab-&gt;name&#091;$lang&#091;&#039;id_lang&#039;]] = &#039;WK Demo Module&#039;;\n        }\n\n        return $tab-&gt;add();\n    }\n\n    private function uninstallTab()\n    {\n        $idTab = (int) Tab::getIdFromClassName(&#039;AdminWkDemo&#039;);\n        if ($idTab) {\n            $tab = new Tab($idTab);\n            return $tab-&gt;delete();\n        }\n        return true;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6. <strong>List View (Twig)<\/strong><\/h4>\n\n\n\n<p>Create <strong>views\/templates\/admin\/demo\/index.html.twig<\/strong>. Symfony controllers use Twig instead of Smarty.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">{% extends &#039;@PrestaShop\/Admin\/layout.html.twig&#039; %}\n\n{% block content %}\n&lt;div class=&quot;card&quot;&gt;\n  &lt;h3 class=&quot;card-header&quot;&gt;\n    &lt;i class=&quot;material-icons&quot;&gt;list&lt;\/i&gt;\n    {{ &#039;Demo Data List&#039;|trans({}, &#039;Modules.Wkdemomodule.Admin&#039;) }}\n  &lt;\/h3&gt;\n\n  &lt;div class=&quot;card-body&quot;&gt;\n    &lt;table class=&quot;table&quot;&gt;\n      &lt;thead&gt;\n        &lt;tr&gt;\n          &lt;th&gt;ID&lt;\/th&gt;\n          &lt;th&gt;Name&lt;\/th&gt;\n          &lt;th&gt;Status&lt;\/th&gt;\n          &lt;th&gt;Actions&lt;\/th&gt;\n        &lt;\/tr&gt;\n        &lt;\/thead&gt;\n        &lt;tbody&gt;\n        {% for item in gridData %}\n        &lt;tr&gt;\n          &lt;td&gt;{{ item.id }}&lt;\/td&gt;\n          &lt;td&gt;{{ item.name }}&lt;\/td&gt;\n          &lt;td&gt;{{ item.status }}&lt;\/td&gt;\n          &lt;td&gt;\n            &lt;a href=&quot;{{ path(&#039;wk_demo_edit&#039;, {id: item.id}) }}&quot;\n              class=&quot;btn btn-sm btn-primary&quot;&gt;\n              &lt;i class=&quot;material-icons&quot;&gt;edit&lt;\/i&gt;\n              Edit\n            &lt;\/a&gt;\n          &lt;\/td&gt;\n        &lt;\/tr&gt;\n        {% endfor %}\n        &lt;\/tbody&gt;\n    &lt;\/table&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n{% endblock %}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">7. Create Form View<\/h4>\n\n\n\n<p>Create<strong> views\/templates\/admin\/demo\/form.html.twig<\/strong>. Symfony controllers use Twig instead of Smarty.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">{% extends &#039;@PrestaShop\/Admin\/layout.html.twig&#039; %}\n\n{% block content %}\n&lt;div class=&quot;card&quot;&gt;\n  &lt;h3 class=&quot;card-header&quot;&gt;\n    &lt;i class=&quot;material-icons&quot;&gt;edit&lt;\/i&gt;\n    {{ isEdit is defined ? &#039;Edit Demo Item&#039; : &#039;Add Demo Item&#039; }}\n  &lt;\/h3&gt;\n\n  &lt;div class=&quot;card-body&quot;&gt;\n    &lt;form method=&quot;post&quot;&gt;\n      &lt;div class=&quot;form-group&quot;&gt;\n        &lt;label&gt;{{ &#039;Name&#039;|trans({}, &#039;Admin.Global&#039;) }}&lt;\/label&gt;\n        &lt;input type=&quot;text&quot;\n               name=&quot;demo_name&quot;\n               class=&quot;form-control&quot;\n               value=&quot;{{ demoItem.name|default(&#039;&#039;) }}&quot;\n               required&gt;\n      &lt;\/div&gt;\n\n      &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;\n        {{ &#039;Save&#039;|trans({}, &#039;Admin.Actions&#039;) }}\n      &lt;\/button&gt;\n    &lt;\/form&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n{% endblock %}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Reference Screenshots for the PrestaShop Module<\/h4>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"518\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/module-1200x518.webp\" alt=\"Module installed successfully.\" class=\"wp-image-524785\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/module-1200x518.webp 1200w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/module-300x129.webp 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/module-250x108.webp 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/module-768x331.webp 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/module-1536x663.webp 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/module.webp 1587w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"526\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/listing-1-1200x526.webp\" alt=\"Symfony admin controller listing page.\" class=\"wp-image-525315\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/listing-1-1200x526.webp 1200w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/listing-1-300x132.webp 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/listing-1-250x110.webp 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/listing-1-768x337.webp 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/listing-1-1536x673.webp 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/listing-1.webp 1599w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"529\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/form-1200x529.webp\" alt=\"form\" class=\"wp-image-524789\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/form-1200x529.webp 1200w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/form-300x132.webp 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/form-250x110.webp 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/form-768x339.webp 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/form-1536x677.webp 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/form.webp 1599w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"529\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/edit-1200x529.webp\" alt=\"Symfony edit form page.\" class=\"wp-image-525316\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/edit-1200x529.webp 1200w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/edit-300x132.webp 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/edit-250x110.webp 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/edit-768x338.webp 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/edit-1536x677.webp 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/edit.webp 1598w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Support<\/h4>\n\n\n\n<p>If you are facing any issues or have any doubts about the above process, please feel free to contact us through the comment section.<\/p>\n\n\n\n<p>Also, you can explore our&nbsp;<a href=\"https:\/\/webkul.com\/prestashop-development\/\">PrestaShop Development Services<\/a>&nbsp;and a large range of quality&nbsp;<a href=\"https:\/\/store.webkul.com\/PrestaShop-Extensions.html\">PrestaShop Modules<\/a>.<\/p>\n\n\n\n<p>For any doubt, contact us at&nbsp;support@webkul.com<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A developer can migrate PrestaShop Back Office controllers from legacy to Symfony by building a demo module wkdemomodule with a simple create, save, and list form. Migrating PrestaShop legacy Controllers to Symfony From PrestaShop 1.7, the Back Office uses Symfony. Migrating legacy module controllers to Symfony provides clean routing, dependency injection, and reusable Twig templates <a href=\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\">[&#8230;]<\/a><\/p>\n","protected":false},"author":742,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[209],"tags":[2065],"class_list":["post-523083","post","type-post","status-publish","format-standard","hentry","category-prestashop","tag-prestashop"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PrestaShop Back Office Controllers: Legacy to Symfony - Webkul Blog<\/title>\n<meta name=\"description\" content=\"Learn how to migrate PrestaShop Back Office controllers from the legacy system to Symfony by building a demo module.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PrestaShop Back Office Controllers: Legacy to Symfony - Webkul Blog\" \/>\n<meta property=\"og:description\" content=\"Learn how to migrate PrestaShop Back Office controllers from the legacy system to Symfony by building a demo module.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\" \/>\n<meta property=\"og:site_name\" content=\"Webkul Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webkul\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-09T06:19:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-13T09:57:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp\" \/>\n<meta name=\"author\" content=\"Sachin Chauhan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webkul\" \/>\n<meta name=\"twitter:site\" content=\"@webkul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sachin Chauhan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\"},\"author\":{\"name\":\"Sachin Chauhan\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/2301b63189408cd1f037f6ad6f491d50\"},\"headline\":\"PrestaShop Back Office Controllers: Legacy to Symfony\",\"datePublished\":\"2026-02-09T06:19:41+00:00\",\"dateModified\":\"2026-02-13T09:57:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\"},\"wordCount\":285,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp\",\"keywords\":[\"prestashop\"],\"articleSection\":[\"prestashop\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\",\"url\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\",\"name\":\"PrestaShop Back Office Controllers: Legacy to Symfony - Webkul Blog\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp\",\"datePublished\":\"2026-02-09T06:19:41+00:00\",\"dateModified\":\"2026-02-13T09:57:24+00:00\",\"description\":\"Learn how to migrate PrestaShop Back Office controllers from the legacy system to Symfony by building a demo module.\",\"breadcrumb\":{\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp\",\"width\":1079,\"height\":479},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webkul.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PrestaShop Back Office Controllers: Legacy to Symfony\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webkul.com\/blog\/#website\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"name\":\"Webkul Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webkul.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webkul.com\/blog\/#organization\",\"name\":\"WebKul Software Private Limited\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"width\":380,\"height\":380,\"caption\":\"WebKul Software Private Limited\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webkul\/\",\"https:\/\/x.com\/webkul\",\"https:\/\/www.instagram.com\/webkul\/\",\"https:\/\/www.linkedin.com\/company\/webkul\",\"https:\/\/www.youtube.com\/user\/webkul\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/2301b63189408cd1f037f6ad6f491d50\",\"name\":\"Sachin Chauhan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7eb7023d14f35264e80e660ab99177891def77cf978f6aead1545029d8ada46e?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7eb7023d14f35264e80e660ab99177891def77cf978f6aead1545029d8ada46e?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"caption\":\"Sachin Chauhan\"},\"url\":\"https:\/\/webkul.com\/blog\/author\/sachinchauhan-presta722\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PrestaShop Back Office Controllers: Legacy to Symfony - Webkul Blog","description":"Learn how to migrate PrestaShop Back Office controllers from the legacy system to Symfony by building a demo module.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/","og_locale":"en_US","og_type":"article","og_title":"PrestaShop Back Office Controllers: Legacy to Symfony - Webkul Blog","og_description":"Learn how to migrate PrestaShop Back Office controllers from the legacy system to Symfony by building a demo module.","og_url":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/","og_site_name":"Webkul Blog","article_publisher":"https:\/\/www.facebook.com\/webkul\/","article_published_time":"2026-02-09T06:19:41+00:00","article_modified_time":"2026-02-13T09:57:24+00:00","og_image":[{"url":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp","type":"","width":"","height":""}],"author":"Sachin Chauhan","twitter_card":"summary_large_image","twitter_creator":"@webkul","twitter_site":"@webkul","twitter_misc":{"Written by":"Sachin Chauhan","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#article","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/"},"author":{"name":"Sachin Chauhan","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/2301b63189408cd1f037f6ad6f491d50"},"headline":"PrestaShop Back Office Controllers: Legacy to Symfony","datePublished":"2026-02-09T06:19:41+00:00","dateModified":"2026-02-13T09:57:24+00:00","mainEntityOfPage":{"@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/"},"wordCount":285,"commentCount":0,"publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"image":{"@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage"},"thumbnailUrl":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp","keywords":["prestashop"],"articleSection":["prestashop"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/","url":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/","name":"PrestaShop Back Office Controllers: Legacy to Symfony - Webkul Blog","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage"},"image":{"@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage"},"thumbnailUrl":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp","datePublished":"2026-02-09T06:19:41+00:00","dateModified":"2026-02-13T09:57:24+00:00","description":"Learn how to migrate PrestaShop Back Office controllers from the legacy system to Symfony by building a demo module.","breadcrumb":{"@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#primaryimage","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/02\/structure.webp","width":1079,"height":479},{"@type":"BreadcrumbList","@id":"https:\/\/webkul.com\/blog\/prestashop-bo-controllers-legacy-to-symfony\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webkul.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PrestaShop Back Office Controllers: Legacy to Symfony"}]},{"@type":"WebSite","@id":"https:\/\/webkul.com\/blog\/#website","url":"https:\/\/webkul.com\/blog\/","name":"Webkul Blog","description":"","publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webkul.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webkul.com\/blog\/#organization","name":"WebKul Software Private Limited","url":"https:\/\/webkul.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","width":380,"height":380,"caption":"WebKul Software Private Limited"},"image":{"@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webkul\/","https:\/\/x.com\/webkul","https:\/\/www.instagram.com\/webkul\/","https:\/\/www.linkedin.com\/company\/webkul","https:\/\/www.youtube.com\/user\/webkul\/"]},{"@type":"Person","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/2301b63189408cd1f037f6ad6f491d50","name":"Sachin Chauhan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7eb7023d14f35264e80e660ab99177891def77cf978f6aead1545029d8ada46e?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7eb7023d14f35264e80e660ab99177891def77cf978f6aead1545029d8ada46e?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","caption":"Sachin Chauhan"},"url":"https:\/\/webkul.com\/blog\/author\/sachinchauhan-presta722\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/523083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/users\/742"}],"replies":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/comments?post=523083"}],"version-history":[{"count":20,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/523083\/revisions"}],"predecessor-version":[{"id":525333,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/523083\/revisions\/525333"}],"wp:attachment":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/media?parent=523083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/categories?post=523083"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/tags?post=523083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}