Inyección de dependencias

https://laravel.com/docs/5.1/controllers


Inyección de dependencias en Laravel 8


Hola, ¿Cómo están? Muy buenas a todos continuando con el curso de Laravel nivel intermedio, hoy veremos lo que son la inyección de dependencias en Laravel 8 también llamado Service Container.

¿Qué es la inyección de dependencias?

La inyección de dependencias es un patrón de diseño de la programación orientada a objetos POO que nos permite disminuir el acoplamiento entre componentes, parte del principio de separar el código por responsabilidades, esto quiere decir que una clase suministra sus métodos y variables a otra clase atreves de objetos que cumplen contratos que necesita la clase para poder funcionar.

Service Container de Laravel

El contenedor de servicios de Laravel es una de las herramientas más poderosas del framework sirve para administrar las dependencias de clases, crear objetos y realizar la inyección de dependencias a través de un constructor o métodos.

Aplicar inyección de dependencias



En nuestra aplicación crearemos una carpeta llamada Repositories en la ruta App/, esta carpeta contendrá toda la lógica de accesos a datos como consultas a nuestra base de datos con Eloquent, así mantener más limpio y legible nuestros controladores y modelos.

Dentro de la carpeta Repositories creamos un archivo CursoRepository.php y empezaremos a escribir código, abrimos la etiquetas de apertura de código PHP, seguidamente especificamos nuestro namespace App\Repositories y creamos la clase CursoRepository.
Inyeccion de dependencias en Laravel
Ahora en nuestro controlador CursoController lo primero es hacer la referencia a la clase CursoRepository.

use App\Repositories\CursoRepository;
En nuestra clase creamos un objeto $cursos de tipo protected para evitar que la propiedad pueda ser modificada. Seguidamente, creamos el constructor que debe recibir un parámetro de la clase que acabamos de crear.

Al parámetro debemos asignarle al objeto $cursos. Finalmente en nuestros métodos utilizaremos el objeto $cursos a la cual asignamos el valor desde el constructor.


protected $cursos;
public function __construct(CursoRepository $cursos){
$this->cursos = $cursos;
}
Ahora veamos algunos ejemplos de inyección de dependencias en nuestra aplicación.

Uso de inyección de dependencias


En primer lugar, en el método index de nuestro controlador CursoController creado en anteriores clases, si observamos el código no es tan legible y contiene bastante código que puede ser optimizado.

Método obtener cursos

Primero, en nuestra archivo CursoRepository importamos las referencias del modelo Curso y la clase DB.

use App\Models\Curso;
use Illuminate\Support\Facades\DB;
En la primera línea de código del método index la variable $cursos obtiene los datos de una consulta; toda esta consulta la llevaremos al método obtenerCursos() que crearemos en nuestra clase CursoRepository donde pegaremos todo el código de la consulta y retornaremos el resultado.

public function obtenerCursos(){
return DB::table('cursos')
->select('cursos.id', 'cursos.nombre', 'cursos.nivel', 'cursos.horas_academicas','profesores.nombre_apellido as profesor')
->leftJoin('profesores', 'profesores.id', '=', 'cursos.profesor_id')
->get();
}
En nuestra controlador CursoController realizaremos la inyección de dependencias, en la variable $cursos va ser igual a la instancia del objeto que acabamos de asignar en el constructor y vamos a llamar el método obtenerCursos().

$cursos = $this->cursos->obtenerCursos();
Método obtener alumnos por curso

Ahora veremos otro ejemplo en el mismo método index de nuestro controlador CursoController, dentro de la bucle foreach hay una consulta a la base de datos que se está realizando y almacenando en la variable $cursos[]->alumnos.

Este código de la consulta le pasaremos al método obtenerAlumnosQueEstanInscritosEnUnCurso() que crearemos en nuestra clase CursoRepository donde recibe un parámetro $curso_id.

public function obtenerAlumnosQueEstanInscritosEnUnCurso($cursos_id){
return DB::table('alumno_curso')
->select( 'alumnos.nombre_apellido as alumno')
->leftJoin('alumnos', 'alumnos.id', '=', 'alumno_curso.alumno_id')
->where('alumno_curso.curso_id', '=', $cursos_id)
->get();
}
En el controlador CursoController realizamos similar a lo que ya vimos anteriormente, esta vez vamos a llamar al método obtenerAlumnosQueEstanInscritosEnUnCurso y le enviamos como parámetro el Id del curso.

$cursos[$aux]->alumnos = $this->cursos->obtenerAlumnosQueEstanInscritosEnUnCurso($curso->id);
Método obtener curso

De igual manera procedemos esta vez con el método show del controlador CursoController. Primeramente, crearemos el método obtenerCurso() en nuestra clase CursoRepository que recibirá un parámetro $curso_id.

Seguidamente, copiar y pegar todo el código de la consulta y con return devolvemos el resultado.
public function obtenerCurso($curso_id){
return Curso::with(['profesor'])->where('cursos.id', '=', $curso_id)->first();
}
En el método show realizaremos la referencia a obtenerCurso() que acabamos de crear en nuestra clase CursoRepository y le enviamos como parámetro el Id del curso.

Comentarios

Entradas populares de este blog

Filtrando por fecha

10 videojuegos gratis para aprender JavaScript en línea

reloj obs---datetime.lua