:::: MENU ::::

Crear un controlador y acción en Magento 2

Crear un controlador y acción en Magento 2
5 votos, 4.00 media (80% puntos)

Al igual que hemos hecho en artículos anteriores, comenzamos por destacar las diferencias entre la creación de nuevas rutas en Magento 1 y Magento 2, para posteriormente crear una nueva ruta en nuestro módulo.

Controladores y rutas en Magento 2

Controller ahora se escribe con mayúsculas

En Magento 1, la carpeta controllers era un tanto especial, ya que era la única carpeta de clases dentro de un módulo que escribíamos comenzando con letra minúscula.

Esto era un requisito para evitar la carga de controladores de forma automática de las clases por parte del Autoloader, que siempre buscaba nombres con la primera letra en mayúscula. De esta forma se evitaban errores.

En Magento 2, esto ya no es necesario, y la carpeta Controller sigue la misma norma que las demás, es decir comienza con letra mayúscula y se escribe en singular.

Un archivo, una ruta

Otra diferencia fundamental y que debemos tener en cuenta es que en Magento 1, dentro de un archivo controlador podíamos atender a varias URLs. Por ejemplo dentro del controlador Mage_Catalog_Product podríamos ver varias acciones como las siguientes:

/* /catalog/product/view */
function viewAction() {
}

/* /catalog/product/gallery */
function galleryAction() {
}

En Magento 2, cada archivo corresponde a una única acción y la acción viene determinada por el nombre del archivo. La función que se ejecuta siempre es execute. Lo veremos más abajo.

Crear un controlador y una ruta en Magento 2

Para crear una nueva ruta o acción en nuestro módulo, deberemos utilizar la menos 2 nuevos archivos, un archivo de Acción y el archivo de configuración xml para informar a Magento de la existencia de la nueva ruta.

Necesitaremos crear los archivos siguientes (destacados en azul):

app/
  code/
    NV/
      Redsys/
        Controller/
          Redirect/
            Index.php
        etc/
          frontend/
            routes.xml
          module.xml
        composer.json
        registration.php 

Archivo routes.xml

El archivo routes.xml es similar a la sección del archivo config.xml en Magento 1. Los valores que son necesarios son los mismos, pero con una estructura un poco diferente.

Además debemos notar que el archivo routes.xml que estamos definiendo está dentro de una carpeta frontend, lo que denota que estamos creando una ruta únicamente funcional en el frontend de la tienda.

<?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="redsys" frontName="redsys">
            <module name="NV_Redsys" />
        </route>
    </router>
</config>

La primera línea que nos encontramos, indica que estamos creando una ruta para el router estándar de Magento, es decir, para el router del frontend:

  <router id="standard">

A continuación vemos la definición de la ruta en si misma. Indicamos un nombre para la ruta y la parte de la URL que corresponde a la ruta. En ambos casos deben ser identificadores únicos y en este caso hemos decidido que sea “redsys”.

  <route id="redsys" frontName="redsys">
  </route>

Finalmente indicamos a Magento el módulo que gestiona esta ruta mediante el nombre del módulo que estamos desarrollando.

  <module name="NV_Redsys" />

Archivo Index.php

Finalmente tenemos nuestro archivo controlador, o mejor dicho, acción.

Para ello crearemos el archivo Index.php en la ruta indicada anteriormente, con el siguiente contenido.

Como veréis, el contenido del archivo sigue siendo igual de simple que en Magento 1.

namespace NV\Redsys\Controller\Redirect;

class Index extends \Magento\Framework\App\Action\Action {
    
    public function execute() {
        
        echo 'Hola Magento 2';
    }
}

Para comprobar el funcionamiento del módulo, únicamente tendremos que visitar la URL correspondiente y veremos nuestro primer “Hola Magento 2”

http://mitienda.com/redsys/redirect/index



Hey! Qué opinas sobre el artículo?