En esta charla Taylor Otwell nos expuso un resumen sobre los mecanismos internos del framework (como por ejemplo service providers y middleware). En el siguiente post verás una serie de notas sobre los puntos más importantes de la charla y algunos enlaces para que continues aprendiendo cómo funciona Laravel por dentro.

index.php:

Es el archivo principal a donde llegan todas las peticiones del framework.

index.php incluye el archivo /vendor/autoload.php de Composer el cual se encargará de auto cargar todas las clases del framework y de nuestra aplicación.

Aprende más sobre Composer.

app.php (bootstrap):

  1. Primero que nada se crea la instancia del objeto Application:
  2. Luego se registran las clases Kernel y la clase para el manejo de excepciones
  3. El trait CreatesApplication nos permite crear y reinicializar la aplicación

Contenedor del framework

El contenedor (Container) del framework es una de las partes más poderosas de Laravel. Puede de hecho ser usado fuera del framework Laravel. Ejemplo:

class Something {

}

$container = new Illuminate\Container\Container

$container->make(Something::class) // Crea una nueva instancia de Container

La clase Kernel recibe la petición de la aplicación la cual es construida con Request::capture()

Request::capture() este método “captura” todas las variables globales de la petición (por ejemplo $_POST)  y convierte la petición en un objeto encapsulado.

Al llamar al método handle, Laravel entonces procesa la petición y devuelve una respuesta.

Lo cual es una forma sencilla de ver el proceso de nuestra aplicación (tenemos una petición, ejecutamos un proceso y obtenemos una respuesta).

Aprende qué es y cómo crear un contenedor de inyección de dependencias con PHP en nuestro Curso de creación de componentes para PHP y Laravel.

Middleware

Nuestra clase Kernel se encarga de ejecutar los middleware de nuestra aplicación (ya sean middleware globales o asociados a rutas).

A pesar de que con Laravel podemos crear aplicaciones rápidamente (rapid application development), realmente el poder del contenedor de inyección de dependencias nos permite crear proyectos grandes de nivel empresarial, puesto que nos brinda la capacidad manejar contratos o interfaces y luego cambiar una implementación por otra de forma muy sencilla, escribir clases desacopladas, etc.

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Uso del objeto Request

Aunque Laravel nos permite inyectar el objeto Request de nuestra aplicación en cualquier clase de nuestro proyecto, Taylor nos recomienda inyectarlo únicamente en nuestras rutas y controladores y luego pasar partes de nuestro objeto Request (por ejemplo el usuario conectado, o el valor de ciertos campos) a otros métodos de nuestro proyecto.

Un ejemplo sencillo:

    public function store(Request $request)
    {
        $this->validate($request, [/*...*/]);

        Post::create($request->all());
    }

Bootstrapers

La clase Kernel nos permite incluir una serie de “Bootstrappers” para cargar variables de entorno, configuración, manejar excepciones, etc.

Service Providers

Nos permiten registrar clases y objetos en el contenedor de Laravel de forma que estén disponibles dentro de toda nuestra aplicación.

Los service providers:

  • Tienen la responsabilidad de registrar “features” en el framework.
  • Nos permiten registrar rutas, por lo cual podríamos hacer toda nuestra aplicacion como componentes y registrarlos como service providers en nuestra aplicación. Un ejemplo de ello es Laravel Spark
  • Brindan una función (register) para poder configurar tu aplicación de la forma que quieras y esto los hace muy flexibles y poderosos.

Los Service providers pueden ser de 3 “tipos”:

  • Los que incluye el framework Laravel
  • Los que pertenecen a tu aplicación (como AppServiceProvider)
  • Los que incluyen componentes externos (como Styde\Html)

Nunca llames nada en el método register de un service provider que dependa de otro service provider. Si quieres hacer esto, usa el método “boot” puesto que al ejecutarse este método ya se habrá ejecutado el método register de todos los service providers.

Pipeline es un componente que nos permite enviar objetos a través de otros objetos: por ejemplo enviar un objeto Request a través de diferentes middleware.

  1. Enviar un nuevo request
  2. Enviarlo a través de todos los middleware
  3. Despachar al router.

Taylor menciona que los Middleware son como una «cebolla» en el sentido que son como diferentes capas por las cuales pasa la petición del usuario y cualquiera de ellas puede rechazar la ejecución de la aplicación: como por ejemplo el middleware de autenticación que puede rechazar una petición si el usuario no está autenticado.

Obteniendo el usuario conectado

No se puede acceder al usuario conectado en el método boot() de un service provider puesto que dicho método se ejecuta ANTES de que Laravel procese el objeto Request.

Por la misma razón no se puede acceder al usuario conectado en el constructor de un controlador.

Pero puedes usar un middleware:

public function __construct()
{
    $this->middleware(function ($request, $next) {
        $this->account = Account::find(session('account_id'));

        return $next($request);
    });
}

El router se encargará de despachar la ruta que coincida con la petición y ejecutar los middleware relacionados a dicha ruta.

Puedes aprender más sobre este tema en el post de Joseph Silber: Get the current user or other data in a Laravel controller constructor

Consola de comandos

El manejo de comandos es similar al manejo de las peticiones HTTP.

Quizás la diferencia principal es el bootstrapper SetRequestForConsole que crea un objeto Request “dummy” para permitirnos por ejemplo llamar al método url() del objeto Request.

The handle method captura el request de la consola, identifica el comando y devuelve una respuesta dependiendo del comando ingresado.

Laravel Foundation

Todas estas bases que hemos aprendido hasta ahora son las que hacen que Laravel sea realmente flexible

El uso de service providers y bootstrappers agregan una gran flexibilidad que permiten extender la funcionalidad del framework, usar nuevas dependencias, incluir paquetes externos y todo aquello que sea necesario dentro de cada una de nuestras aplicaciones.

Cómo escribir paquetes para Laravel

Podemos convertir básicamente cualquier paquete de PHP en Composer en un paquete para laravel usando Service Providers.

Si quieres aprender más sobre cómo funciona el contenedor de inyección de dependencias de Laravel, los service providers e incluso las facades, te recomiendo altamente que veas mi Curso de creación de componentes de PHP donde trato todos estos temas con mucho detalle y uno a uno.

Más sobre Laracon Online

Aquí puedes encontrar un resumen de cada charla del evento

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.