Hoy os vamos a explicar una pequeña mejora que hará nuestra vida más fácil a la hora de programar nuestros propios controladores.

Anotaciones en Symfony

Symfony tiene una pequeña peculiaridad que hace que programarlo sea un poquito más ameno. Esta pequeña peculiaridad son las anotaciones. 

Las anotaciones son pequeños comentarios que generalmente preceden a una definición, ya sea un controlador, un método o incluso una variable.

Estas anotaciones nos ayudan en gran medida para poder definir los tipos de clases con los que estamos trabajando sin tener que estar constantemente creando código extra para tener que definirlo, llamarlos…

En este pequeño articulo os explicaremos de un módulo que recién se portó a drupal 8 y nos permite crear anotaciones con gran parte de la configuración que necesitaría un controlador “básico”.

Si quieres saber más sobre anotaciones te recomiendo esta lectura: Anotaciones en symfony.

Controller Annotations

El módulo de drupal 8 que nos permitirá acceder a esta funcionalidad se llama Controller Annotations el cual solo vamos a tener que descargarnos e instalarlo como un módulo normal en drupal 8.

Si usais composer en vuestra instalación drupal aqui teneis la linea:

composer require drupal/controller_annotations
drush en controller_annotations -y

Al activar este módulo estaremos añadiendo esta nueva funcionalidad a nuestro drupal y nos permitirá poder empezar las anotaciones que estén disponibles.

Un ejemplo de uso sería el siguiente:

namespace Drupal\acme\Controller;

use Drupal\controller_annotations\Configuration\Route;
use Drupal\controller_annotations\Configuration\Cache;
use Drupal\controller_annotations\Configuration\Template;
use Drupal\controller_annotations\Configuration\ParamConverter;
use Drupal\controller_annotations\Configuration\Method;
use Drupal\controller_annotations\Configuration\Security;
use Drupal\controller_annotations\Configuration\Title;
use Drupal\node\Entity\Node;

/**
 * @Route("/articles")
 * @Cache(expires="tomorrow")
 */
class ArticleController
{
    /**
     * @Route
     * @Template
     * @Security(permission="access content")
     * @Title("My Title")
     */
    public function indexAction()
    {
        $articles = ...;

        return ['articles' => $articles];
    }

    /**
     * @Route("/{id}", name="article_edit")
     * @Method("GET")
     * @ParamConverter("article", options={"bundle": "article"})
     * @Template("acme:article:edit", vars={"article"})
     * @Cache(smaxage="15")
     * @Security(role="administrator")
     */
    public function editAction(Node $article) { }
}

Como podemos ver en el ejemplo anterior en el método “editAction”, previamente a su definición hemos añadido unas líneas de código comentadas con un toque peculiar.

Estas líneas comentadas no son más que la forma que tiene Symfony para crear anotaciones y es así como las deberemos crear nosotros.

Si analizamos un poquito el ejemplo, podemos ver que simplemente con esas anotaciones ya le estamos dando una cierta lógica al método creado, de hecho no hemos necesitado añadir ni una linea de código al método ya que las anotaciones hacen todo por nosotros.

En este caso, estamos diciendo que cuando el usuario entre a “/articles/(id)” con una id valida, siempre que sea de tipo “article” y que el rol del usuario sea “adminitrator“, podrá ver lo que nosotros hayamos programado en la plantilla “modules/acme/templates/acme-articles-edit.html.twig“.

Como podéis ver con que facilidad y que pocas lineas hemos creado algo que probablemente sea muy repetitivo en cualquier desarrollo drupal.

Como destacado, a este pequeño-gran modulo, es la facilidad con la que nos permite añadir un sistema de caches bastante fácil de usar e intuitivo y para mi, que la performance es super importante, creo que hace que este modulo sea imprescindible en cualquier desarrollo drupal a medida.

Si quereis saber mas acerca de las anotaciones aquí os dejo un poco de documentación más ampliada: Anotaciones

Espero que os sirva de ayuda en vuestros futuros desarrollos.