Controller Symfony nel back office di PrestaShop 9: guida pratica
Passare da ModuleAdminController a un controller Symfony dà schermate più veloci e sicure. Ti spieghiamo i passaggi e le trappole delle schede e dei token.
Per anni, le schermate di back office di un modulo si facevano con ModuleAdminController e HelperForm. Funzionano ancora, ma PrestaShop dalla 1.7.6 sta migrando il proprio back office a Symfony, e nella 9 la maggior parte delle schermate del core lo sono già. Un modulo moderno dovrebbe seguire la stessa strada.
1. La rotta
# config/routes.yml
mimodulo_configuracion:
path: /mimodulo/configuracion
methods: [GET, POST]
defaults:
_controller: 'Rekire\MiModulo\Controller\Admin\ConfiguracionController::indexAction'
_legacy_controller: AdminMiModuloConfiguracion
_legacy_link: AdminMiModuloConfiguracion
_legacy_controller collega la rotta a una scheda del menu e al suo sistema di permessi. Senza, la schermata funziona ma non compare evidenziata nel menu e i profili non si possono limitare.
2. Il controller
namespace Rekire\MiModulo\Controller\Admin;
use PrestaShopBundle\Controller\Admin\PrestaShopAdminController;
use PrestaShopBundle\Security\Attribute\AdminSecurity;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class ConfiguracionController extends PrestaShopAdminController
{
#[AdminSecurity("is_granted('read', request.get('_legacy_controller'))")]
public function indexAction(Request $request): Response
{
$form = $this->createForm(ConfiguracionType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// salvare…
$this->addFlash('success', 'Salvato');
}
return $this->render('@Modules/mimodulo/views/templates/admin/configuracion.html.twig', [
'form' => $form->createView(),
]);
}
}
In PrestaShop 9 la classe base consigliata è PrestaShopAdminController e la sicurezza si dichiara con gli attributi di PHP 8. Nella 8 si usa FrameworkBundleAdminController con le annotazioni: se il tuo modulo supporta entrambe le versioni, controlla quale è disponibile.
3. La scheda del menu
Dichiarala nella proprietà $tabs del modulo o creala durante l'installazione. E controlla sempre se esiste già prima di crearla: una scheda duplicata con la stessa classe fa sì che Doctrine restituisca due risultati dove se ne aspetta uno, e la schermata risponde con un errore 500 che non dice niente di utile.
if (!Tab::getIdFromClassName('AdminMiModuloConfiguracion')) {
$tab = new Tab();
// …
$tab->add();
}
4. Token e link
In PrestaShop 9 ogni link del back office porta un token CSRF di Symfony (_token). Non costruire gli URL a mano: usa $this->generateUrl('mimodulo_configuracion') in PHP o path() in Twig. Un URL copiato da un'altra sessione dà «Token non valido».
5. Traduzioni
In Twig: {{ 'Guardar'|trans({}, 'Modules.Mimodulo.Admin') }}. In PHP: $this->trans('Guardar', [], 'Modules.Mimodulo.Admin'). Il dominio segue lo schema Modules.Nombredelmodulo.Zona.
Cosa ci guadagni
- Form con una validazione vera, non controlli fatti a mano.
- Permessi per profilo integrati.
- Schermate che hanno lo stesso aspetto di quelle del core, e che continueranno ad averlo nella prossima versione.