Routing — URLs de modulos y rutas Symfony

Actualizado: 2024-12-01

PrestaShop usa dos sistemas de routing: routes.yml para las paginas del Back Office (Symfony) y hookModuleRoutes para las paginas del Front Office. Ambos permiten crear URLs amigables y parametrizadas.

#Rutas del Back Office (routes.yml)

config/routes.yml — rutas de controllers Symfony en el BO
yaml
# Ruta basica
admin_mymodule_index:
    path: /my-module
    methods: [GET]
    defaults:
        _controller: 'MyModule\Controller\Admin\IndexController::indexAction'
        _legacy_classname: AdminMyModule
        _legacy_link: AdminMyModule

# Ruta con parametro
admin_mymodule_item_edit:
    path: /my-module/items/{id}/edit
    methods: [GET, POST]
    requirements:
        id: '\d+'
    defaults:
        _controller: 'MyModule\Controller\Admin\ItemController::editAction'

# Ruta de eliminacion
admin_mymodule_item_delete:
    path: /my-module/items/{id}
    methods: [DELETE]
    requirements:
        id: '\d+'
    defaults:
        _controller: 'MyModule\Controller\Admin\ItemController::deleteAction'

#Rutas del Front Office (hookModuleRoutes)

hookModuleRoutes — URLs amigables en el Front Office
php
<?php

public function hookModuleRoutes(): array
{
    return [
        // ── Ruta de listado ──
        'module-mymodule-list' => [
            'controller' => 'list',
            'rule'       => 'mi-modulo/listado',
            'keywords'   => [],
            'params'     => ['fc' => 'module', 'module' => $this->name],
        ],

        // ── Ruta de detalle con slug ──
        'module-mymodule-detail' => [
            'controller' => 'detail',
            'rule'       => 'mi-modulo/{slug}',
            'keywords'   => [
                'slug' => ['regexp' => '[_a-zA-Z0-9-]+', 'param' => 'slug'],
            ],
            'params'     => ['fc' => 'module', 'module' => $this->name],
        ],

        // ── Ruta con ID numerico ──
        'module-mymodule-item' => [
            'controller' => 'item',
            'rule'       => 'mi-modulo/item/{id:[0-9]+}',
            'keywords'   => [
                'id' => ['regexp' => '[0-9]+', 'param' => 'id'],
            ],
            'params'     => ['fc' => 'module', 'module' => $this->name],
        ],
    ];
}

#Generar URLs desde PHP

Generar URLs de rutas desde PHP
php
<?php

// ── FRONT OFFICE — usar Link ──
$link = Context::getContext()->link;

// URL de FrontController del modulo
$url = $link->getModuleLink('mymodule', 'list');
$url = $link->getModuleLink('mymodule', 'detail', ['slug' => 'mi-producto']);

// ── BACK OFFICE — usar el Router de Symfony ──
// Desde dentro de un Symfony Controller:
$url = $this->generateUrl('admin_mymodule_item_edit', ['id' => 42]);

// Desde el modulo (mymodule.php):
$container = \PrestaShop\PrestaShop\Adapter\SymfonyContainer::getInstance();
$router = $container->get('router');
$url = $router->generate('admin_mymodule_item_edit', ['id' => 42]);

#Generar URLs desde JavaScript

Router JS en el Back Office de PrestaShop
javascript
// El router de Symfony esta disponible en el BO via window.prestashop.instance.router
// SOLO en el Back Office con los assets del BO cargados

const router = window.prestashop?.instance?.router;

if (router) {
    // Generar URL de una ruta del BO
    const editUrl = router.generate('admin_mymodule_item_edit', { id: 42 });
    console.log(editUrl); // /admin123/my-module/items/42/edit
} else {
    // Fallback para cuando el router no esta disponible
    console.warn('PS Router no disponible');
}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.