Laravel y el Service Layer

Laravel y Service layer

Recientemente me tope con este termino aplicado a Laravel. Al aprender Laravel desde su documentación te da una guía recomendada y funcional de como usarla de una manera exitosa. Sin embargo su eslogan es:

The PHP Framework for Web Artisans

https://laravel.com/

El framework para artesanos Web. Entonces debemos tomar la documentación como una guía y nada más. El resto esta en nuestras manos de artesanos.

Aquí entra el paso extra del service layer. El proceso de un request http en grandes rasgos es así:

Ahora con el service layer sería así

La idea es separar la parte de la lógica del controlador, logrando así tener responsabilidades únicas en cada elemento, el controlador solo tendrá la tarea de llamar a los elementos necesarios y retornar resultados, convirtiéndose es solo un mensajero, manteniendo una arquitectura de software limpia y fácil de mantener.

Service layer es un patrón de diseño que nos permite no repetir código. Permite abstraer la lógica cuando necesitas usar la lógica con diferentes front end. Permite abstraer la lógica de la aplicación a un servicio común.

Ejemplo

Sin service layer

UsersController.php

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;

class UsersController extends Controller
{
     public function create(Request $request){
           $validator = $this->validate($request->all(), [...]);

         User::create([
        'email' => $request->get('email'),
        'name' => $request->get('name'),
        'password' => $request->get('password')
    ]);

        return redirect('users')->with('user', $user);
     }
}

Con service layer

CreateUserService.php

public function make(Request $request)
{
   $user = User::create([
     'email' => $request->get('email'),
     'name' => $request->get('name'),
     'password' => $request->get('password')
   ]);
   return $user; 
}

UsersController.php. Inyecta en el nuevo servicio en el constructor.

public function __construct(CreateUserService $createUserService)
{
    $this->CreateUserService = $createUserService;
}

public function store(Request $request)
{
    $this->CreateUserService->make($request);

    return back()->with(['success' => 'Congratulations!']);
}

Así que ahora sabes, puedes crear usuarios desde diferentes lados, por ejemplo un API y un frontend tradicional con blade. O hasta en proyectos con multiples dominios con ui limitadas o diferentes. Ante cualquier cambio solo tendrás que actualizar tu servicio.

El Vue js más util, Laravel Inertia + Vue JS

Yo aprendi a programar usando vanilla JS y jquery, me convertí un gran fan de jquery. Luego surgieron estos frameworks de frontend, angular, react js, vue, svelte, etc. Y cada año surgen nuevos.

Mi primer acercamiento con esto fue un: pero que necesidad de complicar esto, con jquery ya lo hubiera terminado. Porque al inicio había que hacer muchas cosas para hacerlo correr, aparte de la curva de aprendizaje, el paso inicial era raro y complicado.

Para iniciar no era solo incluir un script tag como jquery, literal copias y pegas una linea y ahí esta jquery listo para usar. Necesitaba utilizarlo con npm, más webpack, más un main.js. Claro luego descubrí que si habían mas opciones, que no solo era webpack, y que si habían script tag para angular, etc.

Esta semana me tope con un curso de Platzi sobre Inertia + Vue Js, aplicaciones single page. Era corto y me pareció interesante pues no conocía Inertia.

The Inertia stack provided by Jetstream uses Vue.js as its templating language. Building an Inertia application is a lot like building a typical Vue application; however, you will use Laravel’s router instead of Vue router. Inertia is a small library that allows you to render single-file Vue components from your Laravel backend by providing the name of the component and the data that should be hydrated into that component’s «props».

https://jetstream.laravel.com/1.x/stacks/inertia.html

En resumen Inertia provee una stack para usar vue js template junto a Laravel pero le quita toda la complejidad extra y excesiva (a mi gusto) de las redes en frontend. Permite usar las rutas de laravel ya establecidas y permite enviar parámetros desde php cómo props a las paginas de Vue js.

Esto te da todas las ventajas de Vue js, componentes, reactividad, velocidad, acceso a plugins desarrollados por la comunidad, documentación, etc, etc. Pero con el sistema ordenado y funcional de Php + Laravel. Reduce el tiempo de desarrollo de un api para comunicar frontend con backend. Permite ser una aplicación completamente funcional unificada. Permitiendo un approach fullstack completamente funcional.

Claro, para gustos hay colores, dime que piensas tú de inertia + vue js.