Crea tus propios helpers en Laravel
Muchos de ustedes conocen los helpers o funciones globales de Laravel que nos permiten realizar operaciones muy comunes en nuestra aplicación de forma más sencilla, como por ejemplo el helper app
para instanciar objetos desde el Service Container, request
para obtener un objeto con todos los datos del request actual o route
para generar links a rutas nombradas.
Si bien los helpers de Laravel son muy útiles, muchas veces vamos a necesitar crear los nuestros.
Vamos a ver cómo crearlos, dónde declararlos y de qué forma usarlos.
El archivo helpers
Declarar funciones globales en PHP es muy sencillo, es cuestión de escribirlas dentro de un archivo PHP e incluir ese archivo en cualquier lugar donde quisieramos hacer uso de ellas.
Idealmente, seguiremos la convención de usar el nombre helpers.php
para el archivo, con el fin de que otros desarrolladores puedan ubicarlo fácilmente.
No hay una convención sobre la ubicación física del archivo en nuestro proyecto, pero por lo general, se agrega en la raíz del proyecto, junto a otros archivos como artisan
.
Para evitar que nuestros helpers no generen conflictos con otros ya declarados, PHP nos permite hacer un chequeo de existencia de otras funciones con el mismo nombre, algo que nosotros vamos a utilizar en cada declaración:
<?php
if (!function_exists('artisan')) {
function artisan()
{
return app()->make('Illuminate\Contracts\Console\Kernel');
}
}
Una vez declaramos nuestro archivo, para que podamos utilizarlo en el resto del proyecto necesitaremos agregarlo al autoloader de Composer en nuestro composer.json
:
...
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
},
"files": [
"helpers.php"
]
},
...
Una vez hecho esto, tenemos que generar nuevamente nuestro archivo autoload.php
, para esto llamamos al comando dump-autoload de composer:
composer dump-autoload
O más corto aún:
composer du
Ahora ya puedes usar tus funciones helpers en el resto de tu proyecto!
Helpers que usamos con frecuencia
Cada proyecto tiene sus propias funcionalidades que se repiten a lo largo del mismo, pero en todos los proyectos terminamos necesitando siempre estas funciones para tareas generales:
active_route
determina si estamos en la ruta nombrada que estamos comparando, y emite un output si es así, generalmenteactive
. Esto sirve para marcar barras de navegación con el framework Bootstrap cuando navegamos un sitio en Laravel. Podemos cambiar el output si queremos como segundo parámetro, para adaptarlo a otro framework CSS.
if (!function_exists('active_route')) {
function active_route($route, $output = 'active')
{
if (Route::current()->getName() == $route)
return $output;
}
}
user
es un atajo a la muy común combinación deauth()->user()
. Usado en todos los proyectos.
if (!function_exists('user')) {
/**
* @return \Illuminate\Contracts\Auth\Authenticatable|null|App\User
*/
function user()
{
return auth()->user();
}
}
- Algunas fachadas pueden reemplazarse por helpers si es una sintaxis que preferimos más, como
Storage
porstorage()
yDB
pordb()
:
if (!function_exists('db')) {
function db($connection = null)
{
return app()->make('db')->connection($connection);
}
}
if (!function_exists('storage')) {
/**
* @param null $disk
* @return \Illuminate\Filesystem\Filesystem
*/
function storage($disk = null)
{
return app()->make('filesystem')->disk($disk);
}
}
Estas funciones son muy útiles para evitar repetir lógica en distintos lugares de nuestro código, y a la vez mantener la sintaxis sencilla y sobre todo corta y entendible, una gran ventaja de las funciones por sobre las clases utilitarias, y con soporte del IDE, ventaja frente a las fachadas.
Espero que les haya sido de utilidad!