
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.