Création de controllers

Déclaration de la route

La route pour le front est définie dans le fichier etc/frontend/routes.xml. Le fichier 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="adexos_formation" frontName="adexos_formation">
            <module name="Adexos_Formation" />
        </route>
    </router>
</config>

Utilisation des controllers

Les controllers sont situés dans le dossier Controller du module. À la différence de Magento 1, chaque action a sa propre classe avec sa méthode execute.

Les controllers étendent la classe \Magento\Framework\App\Action\Action

<?php 
namespace Adexos\Formation\Controller\Quote;

class Request extends \Magento\Framework\App\Action\Action implements HttpGetActionInterface {}

TP - Création d'un formulaire de demande de devis

Créer notre controller dans app/code/Adexos/Formation/Controller, nous l'appelerons Quote/Request.php.

Ce controller ne fera qu'afficher un template dans un premier temps.

<?php
namespace Adexos\Formation\Controller\Quote;

class Request extends \Magento\Framework\App\Action\Action implements HttpGetActionInterface {
    public function execute()
    {
        return $this->resultFactory->create(ResultFactory::TYPE_PAGE);
    }
}

Testons notre nouvelle page : http://www.maboutique.com/adexos_formation/quote/request/.

  • adexos_formation correspond au frontName déclaré dans le routes.xml
  • quote correspond au nom du "controller"
  • request correspond au nom de "l'action"

Notre nouvelle page est vide, c'est normal, nous n'avons rien indiqué concernant son contenu dans nos layouts.

Les étapes suivantes :

  1. Ajouter dans notre fichier de layout <route_id>_<controller>_<action>.xml, les instructions pour afficher un template dans le contenu de la page
  2. Notre template devra être appelé par un de nos blocks
  3. Le template affiche un formulaire dont l'action du formulaire sera quotePost. L'URL n'est pas en dur, mais est le résultat d'une fonction du block
  4. Le formulaire demande à l'utilisateur son nom, son adresse e-mail et son message

Les routeurs

Déclarer le routeur dans le fichier etc/frontend/di.xml.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\App\RouterList">
        <arguments>
            <argument name="routerList" xsi:type="array">
                <item name="adexos_formation" xsi:type="array">
                    <item name="class" xsi:type="string">Adexos\Formation\Controller\Router</item>
                    <item name="disable" xsi:type="boolean">false</item>
                    <item name="sortOrder" xsi:type="string">60</item>
                </item>
            </argument>
        </arguments>
    </type>
</config>

Ne pas oublier de compiler la DI dès que l'on modifie un fichier di.xml

Nous allons faire en sorte que l'URL /demandededevis match notre controller précédemment créé.

Le routeur devrait ressembler à cela :


/**
 * @param \Magento\Framework\App\RequestInterface $request
 * @return bool|\Magento\Framework\App\ActionInterface
 */
public function match(\Magento\Framework\App\RequestInterface $request)
{
    // Avoid infinite redirection
    if ($request->getModuleName()) {
        return null;
    }

    $identifier = trim($request->getPathInfo(), '/');

    if ($identifier == '<rewrited_url>') {
        $request->setModuleName('frontName')->setControllerName('controller')->setActionName('action');
        $request->setAlias(\Magento\Framework\Url::REWRITE_REQUEST_PATH_ALIAS, $identifier);

        return $this->actionFactory->create(\Magento\Framework\App\Action\Forward::class);
    }

    return false;
}