code

Drupal::httpClient | Consumo datos externos a Drupal

Texto

Consumo datos externos a  Drupal | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

   

 A la mayoría de los que trabajamos con Drupal, en algún momento, nos habrá tocado trabajar en un proyecto, que requería que sirviéramos los datos desde Drupal, para que pudiera ser consumido desde alguna API o herramienta externa, existes múltiples formas de solucionar este problema, mediante el uso de webservices, vistas y varios módulos.

     Si quieres aprender más acerca del uso de Servicios Web en Drupal HAZ CLIC AQUI

     Pero en esta ocasión, nos vamos a referir al caso contrario, es decir, a los pasos necesarios para que podamos consumir, dentro de Drupal, la información provenientes desde una API externa. De esta manera, podremos manipular o presentar los datos, dentro de nuestro proyecto Drupal, sin la necesidad de hacernos responsables de tareas como la insercción o actualización de dichos datos.

   Cómo realizar peticiones de datos externos desde Drupal

     A partir de Drupal 8, se pueden realizar todo tipo de peticiones de datos, hacia fuentes external a Drupal, gracias al método Drupal::httpClient, incluido en el núcleo.  Este método es, simplemente, un envoltorio para que podamos trabajar con la librería de php conocida como Guzzle, que según su página oficial, "Guzzle es un cliente PHP HTTP y un framework, para crear clientes de servicios web RESTful".

     Guzzle utiliza PSR-7 como interfaz de mensajes HTTP. PSR-7 describe interfaces comunes para representar mensajes HTTP. Esto permite que Guzzle funcione con cualquier otra biblioteca que utilice interfaces de mensajes PSR-7.

     Para conocer la versión de nuestro proyecto de Drupal, podremos explorar el archivo composer.lock, y encontraremos varios datos, enlaces, definiciones relacionados con Guzzle:

{
    "name": "guzzlehttp/guzzle",
    "version": "6.5.8",
    "source": {
        "type": "git",
        "url": "https://github.com/guzzle/guzzle.git",
        "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
    },
//

 

     Si quiers conocer más acerca de la versión más reciente de Guzzle, HAZ CLIC AQUI

 

Consumo datos externos a  Drupal | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

   Drupal::httpClient dentro de un módulo personalizado en Drupal

     Si quieres aprender a crear un módulo personalizado HAZ CLIC AQUI

     Para disponer de una fuente de datos externa a Drupal, podremos acceder a la web Data.gov, en la que podremos encontrar un amplio catálogo de informaciones, vía CKAN, con una potente API que nos permitirá realizar, de forma segura, cualquiera de las pruebas relacionadas con nuestras peticiones.

     Vamos a echar un vistazo a algunos ejemplos usando la API de CKAN, para ver la documentación completa HAZ CLIC AQUI.

   Pasos para consumir datos externos a Drupal

     Paso 1 - Inicialización del cliente

       Antes de poder realizar cualquier tipo de petición desde Drupal, vamos a necesitar inicializar el cliente de conexión. Para ello deberíamos incluir la siguiente línea dentro de nuestro Módulo Personalizado:

$client = \Drupal::httpClient();

     Paso 2 - Definir URL de conexión

       Ahora que ya hemos inicializado el cliente, podremos añadir la url y el método que vamos a utilizar para conectarnos y extraer los datos. Para ello, tendremos que agregar una línea como la siguientes, sustituyendo la URL, en caso de utilizar otra dirección.

$client->request('GET', 'http://demo.ckan.org/api/3/action/package_list');

     Guzzle también proporciona una lista de métodos sincrónicos para realizar solicitudes, para ver la lista completa HAZ CLIC AQUI

     Paso 3 - Obtener los datos del requerimiento

       Una vez definidos el método y la url con la que vamos a realizar nuestr petición (Request), necesitaremos recolectar dicha información y guardarla, para luego procesarla, así que añadiremos la siguiente estructura:

$request = $client->get('http://demo.ckan.org/api/3/action/package_list');
$response = $request->getBody();

     Paso 4 - Envío de datos hacia la API

       Ya que hemos aprendido la forma de conectarnos y de recibir los datos, desde una fuenta externa a Drupal, vamos a realizar la prueba contraria, es decir, enviaremos alguna información, en formato JSON, hacia la fuenta externa.

$client = \Drupal::httpClient();
$request = $client->post('http://demo.ckan.org/api/3/action/group_list', [
  'json' => [
    'id'=> 'data-explorer'
  ]
]);
$response = json_decode($request->getBody());

     En el código anterior, hemos cambiado el método GET por el método POST, en client->post(), esto nos ha permitido pasar, además de la url de conexión, un array de nombre "json", compuesto por varias opciones adicionales, entre ellas el formato JSON. Guzzle se encargará de especificar la cabecera de estos datos,  'Content-Type','application/json', así como de añadir el 'json_encoding', para que todo funcione correctamente.

     Finalmente, llamaremos al método json_decode, para decodificar los datos obtenidos en nuestra respuesta.

     Para ver la lista completa de las opciones disponibles, HAZ CLIC AQUI

   Cómo autenticarnos para la conexión

     En algunos casos, necesitaremos autenticarnos, para poder obtener la información desde la fuente externa, con la que deseamos realizar la conexión. En el siguiente ejemplo, puedes ver cómo sería la autenticación para acceder a la API de GitHub.

$client = \Drupal::httpClient();
$request = $client->get('https://api.github.com/user', [
  'auth' => ['username','password']
]);
$response = $request->getBody();

   Como manipular las Excepciones

     Otro de los casos con lo que podremos encontrarnos, son las excepciones. Siempre que utilicemos Drupal::httpClient, tendremos que envolver las excepciones dentro de un bloque try/catch, para poder manejarlas.

     En el siguiente ejemplo, podrás ver cómo manejar una excepción, en un caso de login, para que se muestre en la tabla de errores de Drupal.

$client = \Drupal::httpClient();

try {
  $response = $client->get('http://demo.ckan.org/api/3/action/package_list');
  $data = $response->getBody();
}
catch (RequestException $e) {
  watchdog_exception('my_module', $e->getMessage());
}

     Puedes verificar la lista completa de las excepciones, explorando en la siguiente ubicación: 

CARPETA_RAIZ/vendor/guzzlehttp/guzzle/src/Exception

     Con esta información, podrás obtener diferentes comportamientos, al momento de trabajar con las excepciones.

     El cliente de Guzzle, utiliza un sistema  handler and middleware, para enviar sus peticiones HTTP, puedes revisar la documentación oficial, para que te permita un mayor control sobre el manejo de tus datos, conexiones y resultados.

Consumo datos externos a  Drupal | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony
 

Simple OAuth | Módulo Drupal

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

      Con el crecimiento en la popularidad en utilizar Drupal Desacoplado (Headless), combinando un diseño frontend desarrollado en javascript, a partir de frameworks como Angular, React.js o Vue.js, y a su vez, dejando las tareas relacionadas con gestión de usuarios, permisos y otras, relacionadas con bases de datos a cargo de Drupal; hoy aprenderemos a configurar uno de los módulos necesarios para proteger, este tipo de conexiones, entre Drupal 9 y otras aplicaciones. Nos referimos al módulo Simple Aouth, que nos permitirá configurar accesos y permisos restrictivos, para el intercambio de datos desde y hacia Drupal, de manera protegida.

Cómo instalar y configurar el módulo:

Paso 1 - Descargar el módulo:

     Lo primero que tendrás que hacer es descargarlo, para ello, a partir de Drupal 8 se recomienda que utilices el gestor de paquetes Composer, ya que te facilitará tanto la instalación como futuras actualizaciones del tus proyectos. No obstante también podrías descargarlo desde la Página oficial del módulo y una vez descargado, tendrás que colocarlo en la carpeta "modules" o "modules/contrib", dependiendo de tu instalación.

Paso 2 - Configuración:

     Primero genere un par de claves para que el módulo Simple OAuth las use al cifrar tokens. Estos deben almacenarse fuera de su directorio raíz de Drupal. Recomendamos la siguiente estructura de directorios:

.
├── LICENSE
├── README.md
├── composer.json
├── composer.lock
├── config
├── keys
├── scripts
├── vendor
└── web // > Drupal root directory

Genere las claves necesarias con el siguiente conjunto de comandos:

mkdir keys
cd keys
openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout > public.key
chmod 600 public.key
chmod 600 private.key

     Luego dígale al módulo Simple OAuth dónde encontrarlos. En su sitio de Drupal, en el menú administrativo Administrar, vaya a Configuración > OAuth simple y complete el formulario con las rutas a las claves que acaba de generar.

     Para ello, accederemos a la página de configuración del módulo en la url "/admin/config/people/simple_oauth" y a continuación rellenaremos los campos del formulario con los siguientes detalles:

Access token expiration time: 300
Refresh token expiration time 1209600
Public Key: ../keys/public.key
Private Key: ../keys/private.key

 

Simple OAuth Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     A continuación, configure un nuevo cliente OAuth. Primero agregue un nuevo rol de Drupal. Vaya a Personas > Roles (/admin/people/roles/add) y agregue un nuevo rol llamado "Cliente Gatsby".

Simple OAuth Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Luego, crearemos un usuario y le asignaremos el rol que hemos creado cuando lo agregemos como consumidor en simple OAuth

Simple OAuth Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Luego, en el menú Administrar administración, vaya a Configuración > Simple OAuth > Clientes y haga clic en el botón Agregar consumidor. Complete el formulario y recuerde el valor que ingresa para el campo Nuevo secreto, ya que lo necesitará nuevamente más adelante. En Ámbitos, elija el rol de cliente de Gatsby que acabamos de crear. Finalmente, haga clic en Guardar para agregar el nuevo consumidor.

Simple OAuth Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     En la página resultante, debería ver su nueva lista de consumidores junto con un UUID. Tome nota de este UUID. Combinados con el secreto de arriba, serán su ID de consumidor y clave, que se usarán para las solicitudes de OAuth más adelante

Simple OAuth Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Finalmente, otorgue permiso a los usuarios autenticados para otorgar códigos OAuth 2. En el menú Gestionar administración, vaya a Personas > Permisos (/admin/people/permissions). Marque la casilla "Grant OAuth2 codes" para otorgar al usuario autenticado los códigos de permisos OAuth 2. Luego, desplácese hasta la parte inferior de la página y haga clic en Guardar permisos.

Simple OAuth Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Rest Services en Drupal 9 (Parte 2)

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

      Siempre que trabajemos con proyectos en los que tengamos que testear la funcionalidad de API Rest, es recomendable que utilicemos las herramientas que facilitarán nuestras tareas de testeo, de manera que resulte más simple, el proceso de identificación de posibles errores, aplicar nuevas funcionalidades o crear documentación relacionada con el proceso.

     En nuestro caso, como estaremos trabajando con servicios del tipo REST en Drupal, vamos a tener que realizar varias comprobaciones, sobre las llamadas hacia nuestra API, utilizando GET, POST, PATCH y DELETE, con los cuales obtendremos información desde Drupal, como hemos explicado en el artículo anterior, Cómo trabajar con Rest en Drupal 9 (Parte 1), además de realizar otras operaciones como Añadir, Actualizar o borrar contenidos, por medio de estos métodos.

     En las siguientes líneas trataré de explicar, de la manera resumida, los principios fundamentales para entender, cómo aplicar llamadas a la API Rest que nos permitan la ejecución de las principales operaciones, al emplear esta clase de sistema, con Drupal 9.

     Una de estas herramientas de desarrollo es Postman, que nos ofrece una interfaz gráfica, en la que podremos realizar varios tipos de operaciones relacionadas con API Rest, para facilitarnos el proceso de testeo para nuestros proyectos. Puedes descargar Postman desde su página oficial.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora que ya hemos configurado los servicios dentro de Drupal, para autorizar las consultas, mediante el uso de GET, y obtener así el contenido de varios nodos, vamos a realizar la misma comprobación ejecutando la llamada en Postaman, para ello, una vez descargada la aplicación Postman,  copiaremos la url o "endpoint", que nos devolverá el listado de los nodos de nuestra página de inicio, tal y como los expliqué en el artículo anterior Cómo trabajar con Rest en Drupal 9 (Parte 1), y deberíamos obtener exactamente el mismo resultado.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

    Métodos de autenticación:

          Cuando realizamos llamadas a un API Rest, necesitaremos al menos un método de autenticación, de esa forma, estaremos diciéndole a nuestra aplicación, que tenemos los permisos necesarios para acceder a la información con la que vamos a trabajar.

          Existen varias formas de autenticarnos, a la hora de trabajar con las llamadas al API REST, una de ellas, es el uso de cookies; y aunque generalmente, el uso del método Get para obtener información mediante API REST, no debería necesitar ningún tipo de autenticación, ya que sólo estamos accediendo a información pública, expuesta a cualquier usuario desde nuestro servidor web, al trabajar con los servicios REST en Drupal, nos exige que al menos activemos un método de autenticación.

         Es por esta razón, por la cual lo hicimos en el artículo anterior, al momento de activar nuestro primer servicio con el Método Get, para leer la información sobre los nodos desde nuestro Drupal.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          Por defecto, Drupal utiliza el sistema de Cookies para informarse sobre los datos de nuestro usuario, es por esta razón que al loguearnos en cualquier web de Drupal, la interfaz nos permitirá ver los contenidos para los que tengamos acceso, si somos los administradores, veremos la interfaz del administrador y si somos usuarios de cualquier otro tipo, nos presentará la interfaz de usuario correspondiente.

          Si quieres comprobar las cookies que genera Drupal automáticamente cuando estás logueado como usuario, puedes hacer clic derecho y seleccionar inspeccionar elemento o presionar la tecla F12, en mi caso utilizo Google Chorme, si tu también lo hacer, deberías ver algo como lo que te presento en la siguiente imagen, He seleccionado la pestaña Network y tengo marcada la opción Preserve log, al hacer clic sobre Headers verás la información que estamos enviando a nuestro servidor, donde está alojada la web de Drupal y dentro de estas informaciones podrás comprobar la existencia de las cookies.

          Aunque el uso de Cookies es un método que funciona para que Drupal nos devuelva información, en el caso de una aplicación externa, ubicada en otro servidor, por ejemplo, que quisiera obtener información mediante API REST, necesitaremos un método de autenticación más robusto, porque para Drupal, como cualquier otra aplicación a la que accedamos por servicios web, quien acceda usando este tipo de autenticación, podrá operar con todos los permisos concedidos para ese usuario.

         Otra forma de identificarnos como usuario con permisos frente a Drupal, utilizando API REST, es el uso del TOKEN DE SESIÓN, con el que le diremos a Drupal todo lo que necesita saber acerca de nuestro usuario, para que pueda ofrecernos lo que vamos a necesitar al conectarnos con él.

         Hasta las primeras versiones de Drupal 8, para obtener el TOKEN DE SESIÓN, bastaba con añadir a la url de nuestra web, una vez activado el módulo rest "http//miweb.com/rest/session/token", esto nos imprimía en la pantalla el valor correspondiente, que tendríamos que copiar dentro de los parámetros de configuración, para nuestra API rest.

         Esta opción fue eliminada a partir de las últimas actualizaciones de Drupal 8, por lo que ya no existe en Drupal 9 ni versiones posteriores. En su lugar se añadió un módulo contribuido llamado REST API Access Token, con el cual, según la página oficial:

     "El módulo REST API Access Token proporciona un proveedor de autenticación Drupal que utiliza tokens (en encabezados) como factor principal de autenticación.
Además, el módulo proporciona verificación de firmas para solicitudes y caché de respuestas."

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

        Necesitaremos descargar e instalar este módulo, para realizar las pruebas con las llamadas a la API REST, cuando trabajemos con los métodos POST, PATCH y DELETE, que explicaremos en el siguiente artículo, pero antes de terminar, vamos a hablar de una última herramienta que necesitaremos para testear nuestros servicios web...     

     CURL

          Según la página oficial de PHP: PHP soporta libcurl, una biblioteca creada por Daniel Stenberg que permite conectarse y comunicarse con diferentes tipos de servidores y diferentes tipos de protocolos. Actualmente, libcurl admite los protocolos http, https, ftp, gopher, telnet, dict, file y ldap. libcurl también admite certificados HTTPS, HTTP, POST, HTTP PUT, subidas mediante FTP (también se puede hacer con la extensión FTP de PHP), subidas basadas en formularios HTTP, proxies, cookies, y autenticación usuario+contraseña.

         Dependiendo del sistema operativo con el que estés trabajando, y de la versión de PHP que tengas instalada, la manera en que se configura CURL variará, por lo tanto, sería recomendable que compruebes si la tienes configurada correctamente en tu servidor antes de comenzar con la siguiente fase de estos ejercicios.

    Cómo comprobar si tengo instalado CURL en Drupal 9

          En todas las instalaciones de Drupal, podremos acceder a una página que nos detallará las informaciones principales, relacionadas con las informaciones más relevantes sobre nuestro servidor, Mysql, Php, además de otras relacionadas directamente con la configuración interna de Drupal. 

          Obviamente, para acceder a estos datos necesitarás tener permisos de administrador, y estar logueado dentro de tu web. La url es "/admin/reports/status". Una vez hayas accedido a esta pantalla, podrás hacer clic en el apartado MAS INFORMACIÓN de PHP, donde podrás ver el phpinfo, y comfirmar si ya tienes habilitada esta librería en tu entorno.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Rest Services en Drupal 9 (Parte 1)

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

      Siguiendo con las opciones disponibles para combinar, el uso de Drupal como Backend, con librerías JavaScript del tipo Vue.js o Angular, para el Frontend; hoy abordaré los principios básicos sobre recursos Rest en Drupal 9, para que puedas comenzar a experimentar.

     A partir de su versión 8, se añadieron varios módulos en el núcleo de Drupal, con el fin de facilitarnos la activación de los más utilizados, como es el caso de los servicios web, ya que es cada vez más frecuente, encontrarnos con proyectos, que requieren conectar un sistema robusto de gestión como ofrece Drupal, con aplicaciones para móviles o simplemente, para añadir una presentación de contenidos más flexible, atractiva y amigable de cara a los usuarios finales.

     Con el módulo Rest entre otras opciones, podremos generar, de forma sencilla, todo tipo de contenidos e información en formato Json o XML, además de configurar accesos, para la gestión de usuarios y contenidos a través del uso de APIs, desde prácticamente cualquier tipo de aplicación disponible.

Requisitos:

     - Tener una web Drupal en funcionamiento, con varios contenidos preferiblemente con taxonomías, imágenes, textos y usuarios creados, para que puedas realizar diferentes pruebas.

     Si no tienes contenidos, o prefieres generar contenido de prueba, para realizar tus configuraciones, puedes utilizar el módulo Devel Generate, integrado en el módulo Devel, con el cual podrás generar todo el contenido que necesites basándote en los tipos de contenido que prefieras, haciendo únicamente un par de clics.

     Aquí tienes la explicación de Cómo generar contenidos de Prueba con el módulo Devel

     - Descargar y activar el módulo Rest UI, para facilitar la gestión de los endpoints y accesos utilizando la interfaz de Drupal. Aunque en la página oficial de módulo sólo especifica que es compatible para la versión 8, si lo descargas usando Composer podrás utilizarlo en tu Drupal 9.

Cómo trabajar con Rest en Drupal 9  

     Paso 1 Activación de módulos RESTfull Web Services y Serialization:

          Con la activación y combinación de estos módulos, incluidos en el núcleo de Drupal, a partir de la versión 8, podremos, entre otras cosas, crear nuevas vistas, que nos mostrarán el contenido en formato Json o también podremos añadir vistas de este tipo a otras ya existentes.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          Además de esto módulos, antes de continuar, aprovecharemos para descargar y activar el módulo REST UI que mencionamos en los requisitos, para realizar configuraciones relacionadas con REST, a través de la interfaz de usuario de Drupal.

     Paso 2 Descarga y activación del módulo REST UI:

          Descarga y Activación REST UI:

               Para descargar y activar cualquier módulo de Drupal tienes varias opciones:

     Descarga:

          1.- La forma recomendada a partir de Drupal 8, es utilizando el gestor de paquetes Composer, ejecutando en tu consola el comando:

composer require drupal/restui

 

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          2.- Descargándolo manualmente el módulo desde la página oficial del Módulo Rest UI  y una vez descargado y colocado en carpeta "modules/contrib", si haz descargado todos tus módulos manualmente, deberías crear la carpeta "contrib", para que puedas diferenciar entre tus módulos personalizados y los que están disponibles directamente en la Página oficial de Drupal.

     Activación:

          1.- Utilizando la herramienta de consola Drush, la opción "-y" activará todos los sub-modulos automáticamente.

drush en restui -y

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          2.- Desde la interfaz de usuario de Drupal, en la url "/admin/modules", y luego marcando el check junto al nombre de tu módulo y haciendo clic en el botón guardar que aparecer al final de la página.

     Paso 3 Creación y configuración de una vista en formato Json:

          La primera novedad que podremos comprobar, una vez activados los módulos RESTful Web Services y Serialization, es que si nos vamos a la pantalla para la creación de vistas, en la url "/admin/structure/views/add" y seleccionamos Agregar vista, podremos ver en la parte inferior una nueva opción, llamada Configuración de exportación REST.

         Si seleccionamos esta opción, nos creará una vista en la que podremos mostrar los datos en formato json o xml.

 

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Vamos a comenzar con la creación de una vista tipo REST, en la que mostraremos el listado de artículos, para este ejercicio puedes utilizar el módulo Devel Generate, para crear contenidos de prueba con un par de clics, o si lo prefieres, crear algunos artículos manualmente.

     Una vez tengas los artículos que vas a mostrar en tu vista, puedes aplicar la misma configuración que te muestro en la siguiente imagen, con estas opciones seleccionadas, haremos clic en el botón Guardar y editar, para que se nos abra la pantalla de configuración donde terminaremos de realizar los ajustes necesarios para obtener nuestro objetivo.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Una vez que estemos dentro de la pantalla de configuración de nuestra vista, el primer cambio que deberíamos realizar es modificar la configuración para que el contenido de la vista se muestre en formato json.

     Para ello, primero haremos clic en configuración, dentro del apartado FORMATO, tal y como te muestro en pantalla:

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     A continuación, para este ejercicio, seleccionaremos el formato json y una vez hayamos aplicado el cambio, inmediatamente podremos ver cómo se muestran nuestros artículos en formato json, dentro de nuestra v

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Para este ejemplo hemos creado un sólo artículo, pero nuestra vista muestra un montón de información, debido a que en el FORMATO, está marcada la opción de Mostrar: Entidad, lo que significa que mostrará mucho más de lo que necesitaríamos para realizar consultas y conexión con alguna aplicación.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Una consulta como esta consumiría una gran cantidad de recursos para su ejecución, por lo que se verían afectados el tiempo de respuesta y por lo tanto el resultado final de nuestro desarrollo.

     Para evitar que Drupal nos devuelva información innecesaria por ahora, cambiaremos la opción del Formato, para obtener sólo algunos campos, en lugar de toda la entidad; para nuestro ejemplo, seleccionaremos el título, el autor y la fecha de creación. 

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Una vez añadidos los campos, el resultado final es un listado mucho más sencillo y fácil de leer y manipular:

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Paso 4 Comprobación de la vista en el navegador:

          Para comprobar que nuestra vista en formato Json funciona correctamente, tendremos que acceder con la url que hemos configurado al crearla y el resultado debería ser el mismo que hemos visto en la pantalla de configuración, en mi caso he añadido la extensión de Chorme llamada JSON Viewer:

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Cómo mostrar contenidos de Drupal, en formato json, sin tener que configurar una vista

           Ya conocemos la manera de generar vistas para obtener resultados en formato Json, pero además, podremos acceder directamente a un contenido en concreto, también en formato json, añadiendo a la url de nuestra web, las especificaciones del formato requerido. 

          Por ejemplo, podremos acceder a nuestro artículo 1, o node/1 para que se nos muestre en formato json, añadiendo al final de la url las especificaciones del formato.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          En nuestro caso, sería algo como esto http://drupal9.localhost/node/1?_format=json, si hacemos la prueba en el navegador nos devolverá algo parecido a la siguiente imagen:

 

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          Si hemos obtenido este resultado, es debido a que todavía nos falta indicarle a Drupal, que nos permita acceder de esta forma. Para lograrlo tendremos que habilitar los recursos utilizando el módulo REST UI, Así que nos iremos a la url "/admin/config/services/rest" y dentro buscaremos y activaremos el recurso que nos permita acceder a los contenidos utilizando get, tal y como te muestro a continuación:

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Tan pronto como realicemos estos cambios, si volvemos a nuestro navegador y refrescamos, veremos un contenido similar al que mostrábamos en la vista.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Cómo acceder a vistas ya existentes para que se muestren en formato Json

          Al igual que hemos hecho para acceder a los datos de un nodo, podríamos intentar realizar la misma operación llamando a una vista existente. Por ejemplo, a partir de Drupal 8, en el listado de las vistas, podremos encontrar una llamada frontpage, que nos muestra por defecto todos los contenidos que hayamos creado, sino hemos realizado ninguna otra configuración, para que se muestre otro tipo de página como inicio de nuestra web.

          Cómo vemos en la imagen, la url para esta vista frontpage es /node, por lo tanto, si queremos que nos devuelva sus contenidos en formato json, tendremos que añadir un modo de vista REST, desde la pantalla de configuración, luego le asignaremos una url, por ejemplo /node/rest y realizaremos los mismos cambios del formato que efectuamos en el primer ejemplo de este artículo.

 

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          Cuando hayamos terminado la configuración de nuestra nueva vista, a la que accederemos por la url "node/rest", tendremos que habilitar el recurso, antes de poder escribir en el navegador "http://drupal9.localhost/node/rest?_format=json", ya que si lo hacemos, sin habilitar el recurso, nos devolverá un error al igual que nos sucedió al intentarlo con el nodo.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Por lo tanto, si escribimos en el navegador las mismas especificaciones de formato que aplicamos, para acceder al node/1, deberíamos obtener la vista de nuestra página principal en formato Json.

     Pero, como habrás imaginado, al igual que hicimos con el recurso para acceder al nodo, tendremos que activar otro recurso para lograr este nuevo objetivo.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora que ya sabes cómo habilitar los recursos del módulo REST UI, para acceder a los contenidos, y obtener resultados en formato JSON, si escribes en el navegador, la url para mostrar tu vista "node/rest", con el formato especificado, entonces deberías ver algo parecido a la imagen siguiente, que será equivalente al contenido y campos que hayas configurado en tu vista.

     En este segundo ejemplo con vistas, he añadido el campo título y el campo body.

Rest Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Web Services | Configuración de Servicio personalizado en Drupal 9

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

      ¿Qué es un Servicio?

          Nuestras aplicaciones están llenas de objetos útiles. Un ejemplo de ello es el objeto "Mailer", cuya implementación está relacionada con la gestión de mensajería y correos electrónicos, o por ejemplo, otros objetos, que nos ayudarán con toda clase de operaciones, relacionadas con tablas y bases de datos.  En resumen, casi todo lo que podemos ejecutar dentro de nuestras aplicaciones, se hace posible a través del uso o implementación de estos objetos.        

          En Symfony, a estos objetos se les conoce como Servicios, y cada servicio, a su vez, habita dentro de un objeto especial llamado Service Container, o contenedor de servicios.

         Debido a que, a partir de la versión 8, el núcleo de Drupal está basado en Symfony, podremos acceder y utilizar estos servicios, además de la posibilidad de crearlos a medida, para implementarlos dentro de nuestros proyectos.

         El proceso de creación e implementación de un servicio en Drupal 9, es relativamente simple. Se trata de crear nuestra clase, dentro del módulo personalizado y a continuación, declararla como servicio para poder reutilizarla en cualquier parte del proyecto, mediante el método conocido como Injección de dependencias. Pero antes de ir más allá, vamos a concentrarnos en conocer los fundamentos relacionados con la creación e implementación de un servicio personalizado en Drupal 9.

     Cómo crear un servicio personalizado en Drupal 9  

          Paso 1 - Creación de módulo personalizado:

               Cómo hemos mencionado antes, lo primero que debemos hacer antes de la creación del servicio, es crear nuestro propio módulo personalizado; si todavía no sabes cómo hacerlo, te invito a que pares un momento, antes de continuar,  y eches un vistazo al artículo Cómo crear un módulo en Drupal 9, donde te explico paso a paso y con un video, cómo hacerlo.

Web Services Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony
name: Saludo Service
description: 'Create A service Example'
package: drupaladicto

type: module
core_version_requirement: ^8.8.0 || ^9.0

          Paso 2 - Creación de nuestro servicio personalizado:

              Ahora que ya tenemos nuestro módulo personalizado, vamos a proceder con la creación del servicio. Para este ejemplo, crearemos un servicio al que llamaremos , SaludoService.php y que nos devolverá, mediante el método getSaludo(), y de forma aleatoria, varias frases que solemos utilizar para saludar.

              Si quieres más información relacionada con la estructura de los servicios y otros datos relacionados, puedes visitar la Página Oficial de Drupal

              La clase deberá estar ubicada dentro de la carpeta src, tal y como te muestro en la siguiente imagen:

Web Services Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

A continuación, copia y pega el código dentro de nuestra clase:              

<?php

namespace Drupal\saludo_service;

/**
 * @file
 * Service Example
 */

class SaludoService {

  private $saludo;

  /**
   * Passing parameter to construct method
   */
  public function __construct(){

    $this->saludo = ['Hola','¿Qué tal estás?', 'Buenos Días!!'];

  }

  /**
   * @return string
   */
  public function getSaludo(){

    return $this->saludo[array_rand($this->saludo)];
  }

}

     Paso 3 - Declaración del servicio:

          Como comentábamos al principio de este artículo, los servicios se alojan dentro de un contenedor llamado Service Container, desde donde podrán ser llamados para utilizarlos dentro de cualquier lugar de la web mediante la Injección de Dependencias, para que nuestro servicio personalizado pueda cumplir con esta característica y por lo tanto, se incluido en este contenedor de servicios, tendremos que declararlo como tal, creando el archivo ".service.yml"., al mismo nivel que está nuestro ".info.yml"

Web Services Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          Dentro de este nuevo archivo, tendremos la estructura que te muestro a continuación, en la cual simplemente estamos declarando el servicio y a continuación, añadimos la ubicación de nuestro servicio. Recuerda respetar los espacios del formato "yml" o no funcionará. Además evita el uso de la tecla TAB para los espacios, en su lugar utiliza la barra espaciadora del teclado.

services:
  saludo_service.saludando:
    class: Drupal\saludo_service\SaludoService

     Paso 4 - Testeo del servicio utilizando un controlador:

          Aunque en versiones anteriores a Drupal 9, podíamos comprobar la ejecución de código PHP, directamente utilizando la interfaz de usuario, a la que se añadía esta opción cuando activábamos el modulo Devel, ésta fue eliminada del mismo, por motivos de seguridad. 

          Por esta razón, para poder comprobar nuestro servicio, en lugar de utilizar PHP Unit, utilizaremos un controlador, que nos permitirá crear una página test, donde podremos ver y comprobar el funcionamiento de nuestro servicio, una vez hayamos instalado y activado nuestro módulo personalizado.

          Para imprimir el contenido del servicio, crearemos una variable a la que asignaremos el método "getSaludo(); ", que hemos definido dentro de nuestro servicio y luego imprimiremos su valor utilizando la función ksm() del modulo Devel.

          Si todavía no sabes cómo crear un controlador en Drupal 9, te invito a que pares un momento antes de continuar y eches un vistazo a este artículo donde explico, con un video y su documentación paso a paso Cómo crear módulos con su Controlador y Plantilla en Drupal 9

          El siguiente código es el que deberá tener nuestra clase controlador SaludoServiceController.php para generar la página y posteriormente llamar al servicio e imprimir los resultados de prueba.

<?php

/**
 * @file
 * Implement hook_controller()
 */

namespace Drupal\saludo_service\Controller;

use Drupal\Core\Controller\ControllerBase;


class SaludoServiceController extends ControllerBase {


  public function content(){


    $miservicio = \Drupal::service('saludo_service.saludando');
    $misaludo = $miservicio->getSaludo();

    ksm($misaludo);

    return [
      '#markup' => $this->t('Hello @misaludo', ['@misaludo' => $misaludo ]),
    ];

  }
}

          Además, te dejo el código del archivo saludo_service.routing.yml, donde he definido la dirección a nuestro controlador y su método content para acceder a la página test.

saludo_service.saludopage:
  path: '/test-page'
  defaults:
    _controller: '\Drupal\saludo_service\Controller\SaludoServiceController::content'
  requirements:
    _permission: 'access content'

 

          Cuando hayas comprobado que no te falta ningún archivo, podrás activar el módulo y acceder a la url definida en el path del routing.yml "/testpage" y deberías ver el mismo resultado que te muestro a continuación.

Web Services Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Webservices | Presentación

Un servicio web (en inglés, web service o web services) es una tecnología que utiliza un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones.

En este curso recorreremos las diferentes formas de trabajar con servicios web utilzando Drupal. De esta forma, podrás entender cómo conectar Drupal con otras aplicaciones para el intercambio de información.

Contenidos programáticamente | Creación en Drupal 9

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     A lo largo de los años, Drupal ha ganado la inmerecida fama de que es un CMS muy complejo y difícil de aprender, pero en realidad, todo dependerá de tu capacidad para experimentar con nuevas herramientas y tu actitud de superar cualquier reto que se te presente; verás que no resulta tan complicado, si dedicas el tiempo necesario y tienes la suficiente paciencia contigo.

     Si todavía no lo conoces, te animo a que empieces desde hoy mismo con este curso gratis de Drupal 9 paso a paso en español y en un par de semanas te llevarás la grata sorpresa de lo mucho que puedes lograr si pones verdadero empeño.

   LO QUE NECESITAS ANTES DE EMPEZAR CON ESTE EJERCICIO:

  1. Tener Drupal funcionando ya sea con un servidor local tipo Xampp o con contenedores de Docker.
     
  2. Haber instalado al menos estos dos módulos esenciales Backup and Migrate y Admin Toolbar
     
  3. (Opcional) Conocimientos básicos sobre Cómo crear un módulo personalizado

     Una vez hayas terminado de configurar todo lo anterior y te sientas con todas las ganas para comenzar, el próximo paso sería hacer tu primera copia de seguridad; de esta forma, te asegurarás de que puedes recuperar la última versión estable de tu desarrollo si hubiera cualquier tipo de fallo durante el proceso.

Así que, para crear esta primera copia de nuestra base de datos estable, nos iremos a la ventana del módulo Backup and migrate usando la siguiente ruta en el navegador o mediante los botones del menú superior "/admin/config/development/backup_migrate" y crearemos la primera copia estable.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

Tan pronto como veamos el mensaje de confirmación de que se ha realizado la copia correctamente, nos toca continuar con el proceso de creación del tipo de contenido y posteriormente su colocación en un módulo personalizado, para que podamos reutilizarlo en cualquier otro proyecto o que nos sirva de base para contenidos más complejos.

PASO 1 CREACIÓN DEL TIPO DE CONTENIDO:

Empezaremos con el proceso de crear nuestro tipo de contenido, añadiéndole los campos correspondientes, funcionalidades y estructura. Es importante que tengas muy claro si tu contenido tendrá dependencias de otros contenidos como vocabularios, referencias a otros contenidos o formularios, etc. La idea es que tu tipo de contenido, tal y como lo definas esté disponible para cualquier otra web de Drupal 8 o 9 o que te sirva como punto de partida para desarrollar otros contenidos más complejos partiendo de una base predefinida.

En este ejercicio, vamos a crear un tipo de contenido llamado "Servicio", al que añadiremos dos campos ( Imagen servicio y Descripción del servicio ), de esta forma podrás apreciar mejor todos los elementos relacionados según el tipo de campo que prefieras emplear.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

PASO 2 CREACIÓN DEL MÓDULO PERSONALIZADO:

     Básicamente, vamos a crear una carpeta con el nombre de nuestro módulo, y la colocaremos dentro de la carpeta "modules/custom", para mantener mejor ordenado el desarrollo de nuestra web. Te recomiendo que utilices el mismo nombre que tendrá tu tipo de contenido y luego añadiremos el archivo "TUMODULO.info.yml", que es necesario para que Drupal lo reconozca como módulo, acompañado de dos carpetas adicionales "config" + "install", donde tendremos que colocar todos los demás archivos relacionados con la definición de nuestro contenido.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

PASO 3 EXPORTACIÓN Y CREACIÓN DE ARCHIVOS:

     Aquí es donde viene la novedad y verdadera ventaja, de utilizar este método para la creación de tus contenidos en un módulo personalizado, en lugar de tener que programar todo desde cero, disminuyendo así considerablemente la generación de errores e investigación de posibles fallos de estructura y ejecución, como en versiones anteriores de Drupal.

     La idea consiste en utilizar la exportación de configuración, incluida en la interfaz de usuario a partir de Drupal 8, para no tener que memorizar un montón de líneas de código, tabulaciones específicas y otras características obligatorias. Haciendo que tus desarrollos puedan ponerse en marcha en el menor tiempo posible.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     Como en cualquier desarrollo, la clave está en los detalles. Debes prestar mucha atención de no saltarte ningún paso del procedimiento, durante la creación y todo saldrá según lo que esperas.

     LO QUE SIEMPRE DEBES VERIFICAR:

     1.- El tipo de contenido: El primer archivo que debes añadir a tu módulo, siempre dentro de la carpeta "config/install" es el que define tu tipo de contenido, por ejemplo, el desplegable te mostrará todos los elementos disponibles, si tu contenido a exportar es un nodo, debes elegir "Tipo de contenido" o "Content Type", pero también podrías exportar cualquier otro elemento, por lo tanto, podrás usar "Tipo de parrafo" o "Paragraphs Type", "Bloque personalizado" o "Custom Block", etc.

     El proceso siempre debería ser igual, primero creas el archivo con el nombre sugerido en la parte inferior de la ventana de exportación y lo guardas en la dentro de la carpeta "config/install" de tu módulo personalizado.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

A continuación, como sugerencia, en la primera línea de cada archivo, pega el nombre sugerido como comentario, o sea, poniéndole una almohadilla delante, de esta forma ayudarás a Drupal a identificar el archivo y a ti de guía para confirmar si haz cambiado el nombre del archivo por error.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     Por último, copia todo el código que está justo debajo del UUID en la interfaz y pégalo en cada uno de tus archivos, dejando algo de espacio a partir del comentario que haz pegado al principio.
 

     2.- Todos los contenidos tienen obligatoriamente tres archivos fundamentales:

  • core.entity_form_display.node.servicio.default.yml: Que define el formulario que se utilizará para crear el contenido.
  • - core.entity_view_display.node.servicio.default.yml: Que define la forma de presentación del contenido.
  • node.type.servicio.yml: Define el tipo de contenido.

El resto de archivos que formarán tu módulo, serán los campos que vienen por defecto o que han sido creados por ti, como taxonomías, patrones de url, campos referenciados a otros contenidos, etc.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     3.- Cada campo tiene dos archivos uno que define sus propiedades específicas, empieza por "field.field", ejemplo "field.field.node.servicio.field_descripcion_del_servicio.yml" y otro que define la manera en que serán guardados los datos, empieza por "field.storage", ejemeplo "field.storage.node.field_descripcion_del_servicio.yml"

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     Por lo tanto al crear el archivo para cada campo asegúrate de hacerlo con sus correspondencias, antes de pasar a los archivos del siguiente campo, así tendrás más control si quieres modificar los nombres que crea Drupal a los campos por defecto y evitas errores por falta de algún archivo equivalente. 
 

     4.- No olvides añadir dependencias. Siempre que vayas a crear contenidos siguiendo este método, añade al menos una dependencia en el archivo info.yml de tu módulo, eso facilitará que te acostumbres mejor a la estructura de creación de este archivo.

PHPUnit en Drupal 8 | Prueba del navegador

Texto

En este tutorial abarcaremos los conceptos básicos de las pruebas del navegador PHPUnit en Drupal 9. ¡Al final, deberías poder escribir tu primera prueba del navegador!

     Para este ejemplo, usaremos el módulo Rules, ya que podemos incluir algunas pruebas funcionales del navegador. Luego, el tutorial explicará cómo probar la interfaz de usuario de Rules, para asegurarse de que funcione correctamente.

     Prerrequisitos:

     Una instalación de Drupal 8 funcionando:

     - Cómo instalar cualquier versión Drupal 8 usando Composer
 

     - Cómo Instalar LAMP usando WSL2 en Windows 10 (1era Parte)

     Composer instalado:

     - Cómo instalar Composer 2 en Ubuntu 20.04

      Módulos instalados:

       RulesAdmin ToolbarPathauto

    Configuración para el tutorial

        Primero, necesitaremos asegurarnos de que el módulo  Rules esté instalado (descárguelo y agréguelo a su carpeta de módulos). PHPUnit es parte de las dependencias de Composer del núcleo de Drupal, así que asegúrese de haber ejecutado la instalación de composer en tu Drupal 8. Familiarícese con la ejecución de pruebas PHPUnit y asegúrese de habilitar BROWSERTEST_OUTPUT_DIRECTORY e printerClass en su archivo phpunit.xml como se explica en esa página.

   ¿Qué debería probar con BrowserTestBase?

        BrowserTestBase le ofrece una forma de probar comportamientos e interacciones basados en la web. Por ejemplo, si desea verificar que se requiere un determinado permiso antes de que un usuario pueda visitar una determinada página, debe crear un usuario sin ese permiso e intentar visitar la página, y luego comparar el resultado con otro intento con ese permiso. 

        BrowserTestBase satisface la necesidad de realizar pruebas de alto nivel basadas en solicitudes de integraciones entre varios subsistemas en Drupal. Por lo general, las pruebas de BrowserTestBase no deberían requerir temas o configuración específicos del sitio, aunque es posible escribir pruebas con esos requisitos. Otras herramientas como Behat podrían usarse para pruebas de comportamiento específicas del sitio.

        Finalmente, BrowserTestBase reemplaza el WebTestBase heredado basado en Simpletest. Si está migrando desde Simpletest de Drupal, le resultará relativamente fácil convertir las pruebas de WebTestBase a BrowserTestBase.

   Cómo funcionan las pruebas del navegador de Drupal

      La mayor parte de Drupal es una funcionalidad orientada a la web, por lo que es importante tener una forma de ejercitar estas funciones. Las pruebas del navegador crean una instalación completa de Drupal y un navegador web virtual y luego usa el navegador web virtual para guiar la instalación de Drupal a través de una serie de pruebas, tal como lo haría si lo estuviera haciendo a mano.

   Acerca del escenario de prueba del módulo Rules

        El módulo Reglas proporciona una interfaz de usuario para los administradores donde pueden crear reglas. Consiste en múltiples páginas y formularios que queremos probar, los cuales están protegidos con permisos de usuario para que solo los administradores puedan acceder a ellos. El escenario de prueba más simple está en rules/tests/src/Functional/UiPageTest.php.

    Descubriendo lo que necesitamos probar

        Si instala el módulo Reglas, puede seguir manualmente los pasos y ver lo que cree que debe probarse. Si todavia no haz trabajado con Rules, te enseño todo lo que necesitas asaber en este artículo Cómo crear nuestra primera regla con Rules

        Visite Configuración> Flujo de trabajo> Reglas donde debería ver una página que dice "Aún no hay una regla de reacción". en la tabla de reglas. Puede agregar reglas y configurarlas, pero como primer paso, queremos probar que esta página de descripción general del administrador realmente existe y dice que aún no hay reglas.

   Escribir un archivo de prueba

       Ahora es el momento de crear nuestras pruebas, que haremos en la carpeta rules / tests / src / Functional. PHPUnit encontrará automáticamente los archivos de prueba del navegador en la carpeta tests / src / Functional de un módulo.

     Hay cuatro pasos básicos involucrados en la creación de una prueba:

  • Crear la estructura (simplemente crear una clase que herede de \ Drupal \ Tests \ BrowserTestBase o una clase de prueba de navegador similar)
  • Inicializar el caso de prueba con cualquier creación o configuración de usuario que deba realizarse
  • Crear pruebas reales dentro del caso de prueba
  • Y, por supuesto, intentar desesperadamente averiguar por qué nuestra prueba no funciona de la manera que esperamos y depurar la prueba (y quizás el módulo)

     Para empezar con la creación de nuestro archivo de pruebas, necesitaremos extender la clase BrowserTestBase.

namespace Drupal\Tests\rules\Functional;

use Drupal\Tests\BrowserTestBase;

/**
 * Tests that the Rules UI pages are reachable.
 *
 * @group rules_ui
 */
class UiPageTest extends BrowserTestBase {

     Como siguiente paso, debemos especificar la lista de módulos que deben habilitarse para la ejecución de prueba. En nuestro caso, esto es, por supuesto, las Rules.

  /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = ['node', 'rules'];

   Luego viene el setUp() opcional . Aquí es donde debemos hacer todo lo que sea necesario para que esta instancia de Drupal funcione como queremos. Tenemos que pensar: "¿Qué tuve que hacer para pasar de una instalación de Drupal de stock a donde puedo ejecutar esta prueba?". No todos los casos de prueba necesitarán esto, pero aquí hay un ejemplo en el que preparamos un tipo de contenido (tomado de las reglas ConfigureAndExecuteTest):

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    // Create an article content type that we will use for testing.
    $type = $this->container->get('entity_type.manager')->getStorage('node_type')
      ->create([
        'type' => 'article',
        'name' => 'Article',
      ]);
    $type->save();
    $this->container->get('router.builder')->rebuild();
  }

   Tenga en cuenta que si implementa el método setUp(), empiece por ejecutar el método parent::setUp() como en el ejemplo.

   Crear prueba específica: la página de reglas de reacción 

     Ahora necesitamos crear pruebas específicas para ejercitar el módulo. Simplemente creamos métodos de nuestra clase de prueba, cada uno de los cuales realiza una prueba en particular. Todos los métodos deben comenzar con 'prueba' en minúsculas. Cualquier método con visibilidad pública que comience de esta manera será reconocido automáticamente por PHPUnit y se ejecutará cuando se solicite.

     Nuestra primera prueba comprobará la página en admin/config/workflow/rules:

  /**
   * Tests that the reaction rule listing page works.
   */
  public function testReactionRulePage() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);

    $this->drupalGet('admin/config/workflow/rules');
    $this->assertSession()->statusCodeEquals(200);

    // Test that there is an empty reaction rule listing.
    $this->assertSession()->pageTextContains('There is no Reaction Rule yet.');
  }

   setUp() y pruebas individuales

     Cada función de prueba tendrá una instancia de Drupal completamente nueva para ejecutar pruebas. Esto significa que lo que haya creado en una función de prueba anterior ya no estará disponible en la siguiente.

     Considere este ejemplo, tomado de Rules UIPageTest.php -extraction:

namespace Drupal\Tests\rules\Functional;

class UiPageTest extends RulesBrowserTestBase {

 /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = ['rules'];

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();
    // ....
  }
  public function testReactionRulePage() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);
    // .....
  }

  public function testCreateReactionRule() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);
    // .....
  }

  public function testCancelExpressionInRule() {
    // Setup a rule with one condition.
    $this->testCreateReactionRule();
    // .....
  }

}

     Aqui ambos testReactionRulePage() y testCreateReactionRule deben crear su propia $account, porque ambas pruebas se ejecutan en sus propias instancias de Drupal y el Drupal de la última función no tiene cuentas a menos que se cree.

     Sin embargo, otras pruebas (posteriores) pueden depender del contenido creado en otras funciones de prueba si ejecutan esas funciones por separado, como lo hace testCancelExpressionInRule ().

     Por otro lado, la función setUp() se ejecuta antes de cada función de prueba, por lo que también puede usarlo para preparar el entorno de prueba.

   drupalGet() y Assertions

       El código anterior hizo una solicitud GET muy simple en la página admin / config / workflow / rules. Carga la página, luego verifica el código de respuesta y afirma que encontramos el texto apropiado en la página.

       La mayoría de las pruebas seguirán este patrón:

  1. Haga un $ this-> drupalGet ('some / path') para ir a una página
  2. Use $ this-> clickLink (..) para navegar por enlaces en la página
  3. Use $ this-> getSession () -> getPage () -> fillField (...); para completar los campos del formulario
  4. Envíe formularios con $ this-> getSession () -> getPage () -> pressButton (...); o use $ this-> submitForm (...); (o use el método obsoleto drupalPostForm ())
  5. Haga una o más afirmaciones para comprobar que lo que vemos en la página es lo que deberíamos ver.

   Rellenar formularios

    $page = $this->getSession()->getPage();

    $page->fillField('form_element', 'value');
    $page->selectFieldOption('form_element', 'value')

   Assertions (Afirmaciones)

       Hay decenas de posibles assertions. A continuación se muestran algunos ejemplos. Cuando vaya más allá de este tutorial, querrá mirar la clase \ Behat \ Mink \ WebAssert y su hijo de Drupal \ Drupal \ Tests \ WebAssert para leer más sobre ellos.

    $this->assertOptionSelected('form_element', 'value');
    $this->assertFieldByName('form_element');

    $web_assert = $this->assertSession();

    $web_assert->addressEquals('node/1');
    $web_assert->pageTextContains("Expected text");
    $web_assert->pageTextNotContains("Unexpected text");

   Ejecutando la prueba

     Usaremos la línea de comando para ejecutar la prueba. Esto se documenta con más detalle en la ejecutando la página de pruebas PHPUnit.

     Ejecutemos solo el método testReactionRulePage () de UiPageTest:

cd core
../vendor/bin/phpunit --filter testReactionRulePage ../modules/rules/tests/src/Functional/UiPageTest.php
PHPUnit 4.8.11 by Sebastian Bergmann and contributors.

.

Time: 25.14 seconds, Memory: 6.00Mb

OK (1 test, 5 assertions)

HTML output was generated
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-13-411368.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-14-411368.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-15-411368.html

   ¡Sí, nuestra prueba ha pasado! También generó un par de archivos de salida HTML, donde puede ver las páginas que visitó el navegador durante la prueba. Las páginas se escriben en archivos vinculados como, por ejemplo, arriba, por lo que puede inspeccionarlos después de que se haya ejecutado la prueba.

   Una prueba de demostración fallida

      Realmente no nos enseña mucho tener un examen que tenga éxito. Veamos uno que falla.

     Modificaremos la prueba para provocar una falla en la prueba; afirmaremos que la página contiene un texto diferente, que por supuesto no está allí.

  /**
   * Tests that the reaction rule listing page works.
   */
  public function testReactionRulePage() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);

    $this->drupalGet('admin/config/workflow/rules');
    $this->assertSession()->statusCodeEquals(200);

    $this->assertSession()->pageTextContains('some text not actually on the page');
  }

   Ejecute la prueba y vea el resultado:

../vendor/bin/phpunit --filter testReactionRulePage ../modules/rules/tests/src/Functional/UiPageTest.php 
PHPUnit 4.8.11 by Sebastian Bergmann and contributors.

E

Time: 24.38 seconds, Memory: 6.00Mb

There was 1 error:

1) Drupal\Tests\rules\Functional\UiPageTest::testReactionRulePage
Behat\Mink\Exception\ResponseTextException: The text "some text not actually on the page" was not found anywhere in the text of the current page.

/home/klausi/workspace/drupal-8/vendor/behat/mink/src/WebAssert.php:787
/home/klausi/workspace/drupal-8/vendor/behat/mink/src/WebAssert.php:262
/home/klausi/workspace/drupal-8/modules/rules/tests/src/Functional/UiPageTest.php:37

FAILURES!
Tests: 1, Assertions: 5, Errors: 1.

HTML output was generated
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-16-425496.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-17-425496.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-18-425496.html

     Vaya, algo salió mal y nuestra prueba lo detectó. ¡Hurra!

   Cuándo usar t () en las pruebas del navegador

       ¡Nunca! No, ni en los mensajes de afirmación, ni para las etiquetas de los botones, ni para el texto que afirma en la página. Siempre desea probar la cadena literal en la página, no desea probar el sistema de traducción de Drupal.

   Depurar las pruebas del navegador

      Como ya se mencionó, es muy importante habilitar la salida de depuración en la prueba del navegador para que pueda ver las páginas visitadas por el navegador. Si una prueba falla, PHPUnit detiene la ejecución de la prueba donde falla, lo que significa que el último de los enlaces de salida HTML es la página donde ocurrió el error.

     También puede utilizar la función dump () (proporcionada por el componente Symfony VarDumper), ya sea en su método de prueba o en el código del sitio que se está ejecutando. Esto tiene la ventaja sobre el uso de print o print_r () que su salida no se detecta como un error de prueba.

     También puede usar el método ddm () del módulo Devel para generar un archivo de registro. Configure la ubicación del archivo de registro en su código de prueba de esta manera:

    $config = $this->config('devel.settings');
    $config->set('debug_logfile', '/path/to/file/drupal_debug.txt')->save();
    $config->set('debug_pre', FALSE)->save();

   Escribir una clase base para ampliarla con otras clases de prueba.

      Puede encontrar que algunos de sus códigos de prueba duplican la funcionalidad compartida. En este caso, es posible que desee crear una clase base que luego se amplíe con sus diversas clases de prueba. Al hacer esto, hay 2 cosas importantes a tener en cuenta.

  1. La clase de prueba base debe ser abstracta
  2. La clase de prueba base debe terminar con la palabra Base

     Ejemplo de Clase de prueba base: my_module/Tests/src/Functional/myModuleTestBase.php

<?php

namespace Drupal\Tests\my_module\Functional;

/**
 * To be extended by other test classes.
 */
abstract class myModuleTestBase extends BrowserTestBase {
  protected function setUp() {
    parent::setUp();
    // etc
  }
}

     Ampliando la clase base: my_module/Tests/src/Functional/myModuleSomethingTest.php

<?php

namespace Drupal\Tests\my_module\Functional;

/**
 * Test something about my module.
 *
 * @group my_module
 */
class myModuleSomethingTest extends myModuleTestBase {

  protected function setUp() {
    parent::setUp();
  }

  public function testSomething() {
    // do the test.
  }
}

   SQLite

     El uso de una base de datos SQLite hace que las pruebas sean más rápidas que con un DBMS como MySQL. Porque la base de datos está contenida en solo 1 archivo. Asegúrese de que Drupal no esté usando su conexión de base de datos predeterminada desde el archivo settings.php.

     Una solución sencilla es comprobar el HTTP_USER_AGENT. Ej.:

if ($_SERVER['HTTP_USER_AGENT'] !== 'Drupal command line') {

  $databases['default']['default'] = [
    'database' => 'MY-DATABASE',
    'username' => 'root',
    'password' => 'root',
    'prefix' => '',
    'host' => '127.0.0.1',
    'port' => '',
    'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
    'driver' => 'mysql',
    'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
  ];

}

     En su archivo phpunit.xml especifique su conexión de base de datos SQLite (el archivo no debe existir antes):

<env name="SIMPLETEST_DB" value="sqlite://localhost/sites/default/files/db.sqlite"/>

     De lo contrario, obtendrá errores como este:

Exception: PDOException: SQLSTATE[HY000] [2002] Connection refused

   Usar datos de sesión

     Puede inspeccionar los datos de la sesión para la solicitud más reciente de la siguiente manera:

    $session_data = $this->container->get('session_handler.write_safe')->read($this->getSession()->getCookie($this->getSessionName()));
    $session_data = unserialize(explode('_sf2_meta|', $session_data)[1]);

Fuente: https://www.drupal.org/docs/automated-testing/phpunit-in-drupal/phpunit-browser-test-tutorial