Utilice el patrón de diseño de repositorio en una aplicación Laravel

Anteriormente escribí sobre cómo construir una aplicación de tareas con Laravel y Vue.js. Laravel es un marco PHP para construir aplicaciones web escalables y API. Vue.js es un marco Javascript y una alternativa a jQuery o React.

Comience

En este tutorial vamos a agregar funcionalidad a la aplicación que creamos en el tutorial anterior. Clone el repositorio de github, ejecute la instalación del compositor, la instalación de npm y conéctese a su base de datos.

$ mysql -uroot -p
mysql> crear base de datos laravelTaskApp;

Si está atrapado en este punto, consulte otros artículos que he escrito sobre la instalación de MySQL y la configuración inicial de Laravel. En localhost: 8000 puede ver una aplicación que agrega y elimina tareas asincrónicamente. Eso significa que realiza las operaciones y muestra los datos actualizados sin actualizar la página web.

La aplicación de tareas que creamos en el tutorial anterior.

El patrón de diseño del repositorio

En el tutorial anterior escribimos toda nuestra lógica de aplicación en el controlador. Existe un enfoque alternativo para el desarrollo que abstrae algunas llamadas a clases de PHP llamadas repositorios. La idea es que podamos desacoplar modelos de controladores y asignar nombres legibles a consultas complicadas.

Vamos a refactorizar nuestra aplicación para usar el Patrón de repositorio. El primer paso es crear un archivo para app / Repositories / Repository.php.

 model = $ modelo;
    }

    // Obtenga todas las instancias del modelo
    función pública all ()
    {
        devuelve $ this-> model-> all ();
    }

    // crea un nuevo registro en la base de datos
    función pública create (array $ data)
    {
        devuelve $ this-> model-> create ($ data);
    }

    // actualizar registro en la base de datos
    actualización de la función pública (matriz $ data, $ id)
    {
        $ record = $ this-> find ($ id);
        devuelve $ record-> update ($ data);
    }

    // eliminar registro de la base de datos
    función pública borrar ($ id)
    {
        devuelve $ this-> model-> destroy ($ id);
    }

    // muestra el registro con la identificación dada
    función pública show ($ id)
    {
        devuelve $ this-> model-findOrFail ($ id);
    }

    // Obtener el modelo asociado
    función pública getModel ()
    {
        devuelve $ this-> model;
    }

    // Establecer el modelo asociado
    función pública setModel ($ modelo)
    {
        $ this-> model = $ modelo;
        devuelve $ this;
    }

    // Relaciones de base de datos de carga ansiosas
    función pública con ($ relaciones)
    {
        devuelve $ this-> model-> with ($ relaciones);
    }
}

Este archivo define nuestra clase de repositorio. Las instancias de esta clase tienen una propiedad de modelo que vinculamos a un modelo Eloquent. Una vez que esto está vinculado en el constructor, podemos llamar a métodos Eloquent como findOrFail, update o todo desde los métodos de clase.

La sección de RepositoryInterface de implementos no es estrictamente necesaria, pero agrega una capa adicional de estructura a nuestro código. Una interfaz es un contrato que define los métodos que una clase DEBE haber definido. En nuestro caso, la interfaz se ve así:

Si creamos nuevos repositorios que implementen esta interfaz, siempre sabremos que estos métodos están definidos. Las interfaces proporcionan estructura para que sepamos qué debe hacer nuestro código.

De vuelta en nuestro archivo TaskController.php, instanciamos un repositorio y le pasamos el modelo de Tarea.

 model = new Repository ($ tarea);
   }

   índice de función pública ()
   {
       devuelve $ this-> model-> all ();
   }

   tienda de funciones públicas (Solicitud $ solicitud)
   {
       $ this-> validate ($ solicitud, [
           'body' => 'requerido | max: 500'
       ]);

       // crea un registro y pasa solo en campos que se pueden completar
       devuelve $ this-> model-> create ($ request-> only ($ this-> model-> getModel () -> fillable));
   }

   función pública show ($ id)
   {
       devuelve $ this-> model-> show ($ id);
   }

   actualización de la función pública (Solicitud $ solicitud, $ id)
   {
       // actualiza el modelo y solo pasa en los campos rellenables
       $ this-> model-> update ($ request-> only ($ this-> model-> getModel () -> fillable), $ id);

       devuelve $ this-> model-> find ($ id);
   }

   función pública destruir ($ id)
   {
       devuelve $ this-> model-> delete ($ id);
   }
}

El contenedor del servicio Laravel resolverá automáticamente nuestras dependencias y las inyectará en la instancia del controlador (docs).

En este punto, nuestra aplicación funciona exactamente igual, pero nuestro código ha sido refactorizado para usar repositorios y hemos agregado un par más de puntos finales API.

Código fuente disponible en Github

Si es un candidato en el mercado laboral o una startup que busca contratar en el Área de la Bahía, no dude en crear un perfil en Employbl