Symfony-Controller im Backoffice von PrestaShop 9: ein Praxisleitfaden
Der Umstieg von ModuleAdminController auf einen Symfony-Controller bringt schnellere und sicherere Seiten. Wir erklären die Schritte und die Fallen bei Tabs und Tokens.
Jahrelang wurden die Backoffice-Seiten eines Moduls mit ModuleAdminController und HelperForm gebaut. Das funktioniert weiterhin, aber PrestaShop migriert sein eigenes Backoffice seit 1.7.6 auf Symfony, und in der 9 sind die meisten Core-Seiten bereits umgestellt. Ein modernes Modul sollte denselben Weg gehen.
1. Die Route
# 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 verknüpft die Route mit einem Menü-Tab und dessen Berechtigungssystem. Ohne ihn funktioniert die Seite, wird im Menü aber nicht hervorgehoben, und Profile lassen sich nicht einschränken.
2. Der 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()) {
// speichern…
$this->addFlash('success', 'Gespeichert');
}
return $this->render('@Modules/mimodulo/views/templates/admin/configuracion.html.twig', [
'form' => $form->createView(),
]);
}
}
In PrestaShop 9 ist die empfohlene Basisklasse PrestaShopAdminController, und die Sicherheit wird mit PHP-8-Attributen deklariert. In der 8 verwendet man FrameworkBundleAdminController und Annotationen: Wenn Ihr Modul beide Versionen unterstützt, prüfen Sie, welche verfügbar ist.
3. Der Menü-Tab
Deklarieren Sie ihn in der Eigenschaft $tabs des Moduls oder legen Sie ihn bei der Installation an. Und prüfen Sie immer, ob er schon existiert, bevor Sie ihn anlegen: Ein doppelter Tab mit derselben Klasse führt dazu, dass Doctrine zwei Ergebnisse liefert, wo es eines erwartet, und die Seite antwortet mit einem 500-Fehler, der nichts Brauchbares sagt.
if (!Tab::getIdFromClassName('AdminMiModuloConfiguracion')) {
$tab = new Tab();
// …
$tab->add();
}
4. Tokens und Links
In PrestaShop 9 trägt jeder Backoffice-Link ein Symfony-CSRF-Token (_token). Bauen Sie URLs nicht von Hand: Verwenden Sie $this->generateUrl('mimodulo_configuracion') in PHP oder path() in Twig. Eine aus einer anderen Sitzung kopierte URL ergibt „Ungültiges Token“.
5. Übersetzungen
In Twig: {{ 'Guardar'|trans({}, 'Modules.Mimodulo.Admin') }}. In PHP: $this->trans('Guardar', [], 'Modules.Mimodulo.Admin'). Die Domain folgt dem Muster Modules.Nombredelmodulo.Zona.
Was Sie gewinnen
- Formulare mit echter Validierung statt Prüfungen von Hand.
- Integrierte Berechtigungen pro Profil.
- Seiten, die genauso aussehen wie die des Cores und auch in der nächsten Version noch genauso aussehen werden.