Servicios en Drupal 8: Que son y como encontrarlos

Imagen
Desayuno con cereales alrededor

Cuando comenzamos con Symfony, una de las funcionalidades que mas nos llama la atención es su arquitectura orientada a servicios (también llamado inyección de dependencias). Es un estilo de programación que facilita mucho la vida y el poder reusar código fácilmente, pero algo que puede costar es entender que son, y donde encontrarlos.

Que son:

Un servicio simplemente es una clase PHP que realiza una tarea concreta, no tiene mas misterio. Nos permiten realizar fácilmente tareas como enviar emails, acceder a bases de datos o trabajar con la cache.

Por poner un ejemplo, en Drupal 7 accedíamos al usuario actual utilizando "global $user;", pues ahora tenemos un servicio llamado "current_user" el cual nos permite obtener el usuario actual.

 

Donde encontrar los servicios:

En Drupal podemos encontrar los servicios en el archivo /core/core.services.yml, en el veremos todos los servicios que tenemos disponibles (decenas de ellos).

services:
  # Simple cache contexts, directly derived from the request context.
  cache_context.ip:
    class: Drupal\Core\Cache\Context\IpCacheContext
    arguments: ['@request_stack']
    tags:
      - { name: cache.context }
  cache_context.headers:
    class: Drupal\Core\Cache\Context\HeadersCacheContext
    arguments: ['@request_stack']
    tags:
      - { name: cache.context }
  cache_context.cookies:
    class: Drupal\Core\Cache\Context\CookiesCacheContext
    arguments: ['@request_stack']
    tags:
      - { name: cache.context }
  cache_context.session:
    class: Drupal\Core\Cache\Context\SessionCacheContext
    arguments: ['@request_stack']
    tags:
      - { name: cache.context}

Lo anterior son los primeros 4 servicios que están definidos en el archivo /core/core.services.yml, pero podemos ver todos los que contiene el core de Drupal en ese archivo, ademas cada modulo tendrá los propios en el archivo modulo.services.yml.

Otra forma de poder ver los servicios que tenemos disponibles es utilizando Drupal Console, la cual nos provee una gran cantidad de comandos muy útiles, entre ellos se encuentra "debug:container".

$ drupal debug:container
 Service ID                                                        Class Name                                                                        
 access_arguments_resolver_factory                                 Drupal\Core\Access\AccessArgumentsResolverFactory                                 
 access_check.contact_personal                                     Drupal\contact\Access\ContactPageAccess                                           
 access_check.cron                                                 Drupal\system\Access\CronAccessCheck                                              
 access_check.csrf                                                 Drupal\Core\Access\CsrfAccessCheck                                                
 access_check.custom                                               Drupal\Core\Access\CustomAccessCheck                                              
 access_check.db_update                                            Drupal\system\Access\DbUpdateAccessCheck                                          
 access_check.default                                              Drupal\Core\Access\DefaultAccessCheck 

Esto es muy útil para poder ver todos los que tenemos disponibles, tanto en el core, como los módulos del core y contribuidos; ademas también nos muestra el namespace de la clase.

Podemos acceder a documentación o bien a la API si queremos mas información.