Créer un Controller et ses actions sous Magento 2

Ce tutoriel est le 2eme d’une longue série de tutoriel magento2. Il sera mis à jour au fur et à mesure des évolutions de la plateforme. Vous allez maintenant apprendre a créer votre contrôleur et ses actions sous Magento2. Si vous ne connaissez pas magento (v1) ce n'est pas grâve, je vais en parler bien sur mais il n'est pas nécessaire de connaitre la plateforme magento pour maitriser ce tutoriel sur magento2.

Dans cette suite de tutoriel, vous allez créer un module de gestion carnet d'adresse pour magento2 avec une interface d'administration, un front office, des accès à la base de données et tout le reste.

Commencez par créer les dossiers de votre module

Allez dans le dossier app/code en partant de la racine de votre répertoire magento. Créez ensuite un dossier "Pfay" et dedans un autre dossier "Contacts".
Créez ensuite dans le dossier "Contacts", un répertoire "Controller" et un autre répertoire "etc".

Le namespace :
Votre module se trouve dans le namespace Pfay. C'est dans ce dossier que vous allez "stocker" les modules que vous allez créer.
Attention, il ne faut JAMAIS modifier les fichiers du "core" de magento2, c'est à dire les dossier app/code/Magento, sinon lorsque vous essaierez de mettre à jour la plateforme vous allez avoir des problèmes.

Déclarer son module magento2

Maintenant que vous avez créer les dossiers de votre module, il faut "déclarer" son module à magento. Pour cela, nous allons créer le fichier module.xml dans le dossier etc/ de notre module.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Pfay_Contacts" setup_version="2.0.0">
        <sequence>
            <module name="Magento_Cms"/>
        </sequence>
    </module>
</config>

On va également crée le "registration file". allez dans app/code/Pfay/Contacts, créer le fichier registration.php comme ceci :

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Pfay_Contacts',
    __DIR__
);

lorsque vous lancerez la commande suivante :

php bin/magento setup:upgrade

vous verrez s'insérer :

'Pfay_Contacts' => 1

dans le fichier app/etc/config.php. Cela vous permet de vérifier que votre module est bien actif. Pour ceux qui connaissent magento (v1), sous magento2, plus besoin de déclarer son module dans /app/etc/module/, les templates dans design etc... maintenant avec magento2 tout ce qui touche à votre module se trouve directement dans le répertoire de celui ci. Sous magento2 on va retrouver une nouvelle notion, celle de "dépendance forte" et "dépendance faible".

Les dépendances des modules dans magento2

Dépendance forte d'un module
en gros : Magento2 plante si le module dont il dépend n'est pas présent
Le module contient le code qui utilise la logique d'un autre module, les classes, les méthodes statiques, propriétés de la classe publique, une interface, quoique ce soit du module dont il dépend. Le module désérialise un objet déclaré dans un autre module, utilise ou modifie les tables de la bdd crée par un autre module...Bref en gros si on a pas l'autre module ça plante.

Dépendance faible d'un module
en gros : Magento2 ne plante pas si le module dont il dépend n'est pas présent
Le module peut fonctionner sans que le module dont il dépend soit présent, il étend généralement les fonctions d'un autre module (dans la partie logique ou visuelle) mais il vérifie la disponibilité du module dont il dépend avant donc ne fait pas planter magento2 si il n'est pas présent.

Créer mon contrôleur

Dans le dossier app/code/Pfay/Contacts/Controller, créez un dossier Test et dans celui ci, le fichier Index.php suivant :

<?php
namespace Pfay\Contacts\Controller\Test;
class Index extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        die('test index');
    }
}

Attention, vous remarquerez que quand on défini le namespace du fichier, il n'y a pas de \ au début alors qu'il y en a un dans l'extends.
Bref, Ici on crée une classe Index qui est en réalité une Action magento2. En effet, dans magento2, on n'a plus de Contrôleur, on crée directement les actions. Ces actions étendent la classe de base \Magento\Framework\App\Action\Action et ont une fonction execute(). Lorsque sous magento 1.x vous regroupiez les actions dans une classe Controller, maintenant vous regroupez des classes d'Actions dans des dossiers.

Créer la route pour pouvoir accéder à notre module

Afin de pouvoir accéder à notre module via le frontend, il faut créer la route pour le frontend de mon module. Ici nous voulons accéder à notre module via l'url www.magento2.lan/contacts/. On va donc créer le dossier "frontend" dans le dossier "etc" puis y insérer notre fichier "routes.xml".

Le fichier routes.xml est le suivant :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="contacts" frontName="contacts">
            <module name="Pfay_Contacts" />
        </route>
    </router>
</config>

On utilise le routeur "standard" qui permet à accéder à la partie ("area") frontend de notre module magento2 ! Et on lui rajoute la route avec l'id "contacts" pour l’identifier et le frontName "contacts" qui est la clef url par laquelle vous accéderez à votre module sur le frontend. Dans cette route, on défini ensuite notre élément module avec l'attribut name qui contient le "namespace" + "nom de notre module".

Pour votre information sachez qu'on utilisera aussi un fichier de type routes.xml pour créer un chemin dans le backoffice.

Petit point sur l'organisation des contrôleurs

En partant de la racine du Module, on a donc notre fichier
/Controller/Test/Index
On dira dans la suite de ce tutoriel qu'on est sur l'Action Index, du contrôleur Test. on y accédera via l'url

http//www.magento2.lan/contacts/test/index

le fichier nommé index est le fichier qui sera pris par défaut par magento si on ne précise pas l'action dans l'url. On peut donc y accéder via l'url :

http//www.magento2.lan/contacts/test/

Sur ces 2 urls, vous allez voir s'afficher "test index".

Si on veut créer une autre action View par exemple, on peut également créer le fichier View.php dans le répertoire Test qui contiendra :

<?php
namespace Pfay\Contacts\Controller\Test;
class View extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        die('test index');
    }
}

Si vous allez sur l'url :

http//www.magento2.lan/contacts/test/view

Vous verrez s'afficher "test view"

Wtf ! pourquoi chez moi ca s'affiche pas ? quelques solutions...

- ca marche pas ? vider le cache
System > Cache management dans le bo et on désactive tous les caches

- afficher les messages d'erreurs :
renomer local.xml.sample en local.xml dans pub/errors/
et dans /bootstrap.php s'assurer que ses 2 lignes soient décommenter :

error_reporting(E_ALL);
ini_set('display_errors', 1);

-"Setup version for module 'Pfay_Contacts' is not specified"
il vous manque le registration.php dans votre module

-"Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory"
lancer les commande :

php bin/magento setup:upgrade

puis relancer la compilation :

php bin/magento setup:di:compile
Compilation was started.
Interception cache generation... 7/7 [============================] 100% 34 secs 246.0 MiBBMiB

La compilation n'est pas activé en "mode développeur", ces manipulations ne sont donc à faire que lorsqu'on est en prod.
pour activer le déveloper mode (pour pas devoir recompliler à chaque modif...;) ) voici comment faire :

php bin/magento deploy:mode:set developer
Enabled developer mode.



Voilà vous avez crée votre premier routeur sur magento2 avec succès. Félicitation !

Cela ne fonctionne pas chez vous ? Vous pouvez récupérer les sources de ce module sur en téléchargeant les sources en bas de ce tutoriel.

Bon courage à tous pour la suite de ces tutoriels sur magento2 !
Documents disponibles pour cet article :
Questions sur cette leçon
Pas de questions pour cette leçon. Soyez le premier !

Vous devez etre connecté pour demander de l'aide sur une leçon.