En Laravel tip hemos visto en varios artículos (3 directivas MUY útiles para hacer include en Blade, Convertir array PHP a JavaScript) que Blade, el motor de plantillas de Laravel, es muy potente y a su vez fácil de utilizar ya que provee muchas directivas que nos facilitan las cosas a la hora de desarrollar.
Pero Blade puede ir mas allá de sus funciones por defecto y nos permite crear nuestras propias directivas para ampliar sus funciones. En este artículo vamos a ver como extender Blade con directivas personalizadas.
¿Cómo extender Blade? Definiendo nuestra directiva
Laravel Blade nos permite extender sus funcionalidades de una forma muy sencilla. Puede definir una directiva Blade personalizada de la siguiente forma:
El método directive() recibe como primer parámetro el nombre que va a tener nuestra directiva y, como segundo parámetro una función anónima que es la encargada de aplicar la lógica de nuestra directiva.
La variable $expression
es opcional y es el valor que le pasamos a nuestra directiva cuando la utilizamos en nuestra plantilla.
Ejemplo de directiva Blade personalizada
Otro ejemplo de directiva personalizada en Laravel Blade
Definir directiva condicionales con Blade
Si queremos definir una directiva con una condición, Laravel Blade nos brinda el método Blade::if()
para facilitarnos la tarea.
Ejemplo con directiva condicional en Blade
Como podemos ver, Blade nos genera automáticamente las directivas necesarias para manejar la condición. @admin
, @elseadmin
, @else
y @endadmin
.
¿En donde se define las directivas Blade personalizadas?
Todo muy lindo, pero ¿en donde se define el código que vimos en los ejemplos? En los ejemplos de la documentación oficial de Laravel se puede ver que las directivas son definidas en el archivo AppServiceProvider.php pero, para mantener un orden, recomiendo crear un clase especifica que contenga nuestras directivas personalizas. Para esto debemos crear un ServiceProvider con el siguiente comando artisan:
php artisan make:provider BladeServiceProvider
Esto nos creara la siguiente clase en app/Provider/BladeServiceProvider.php.
namespace App\Providers; use Illuminate\Support\ServiceProvider; class BladeServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { // } /** * Register services. * * @return void */ public function register() { // } }
En el método boot()
es donde debemos agregar nuestras directivas Blade personalizadas.
Y por ultimo, registramos nuestro Service Provider en config/app.php
, en la matriz providers.
'providers' => [ // Other Service Providers App\Providers\BladeServiceProvider::class, ],
Para tener en cuenta
Como Blade traduce las directivas a código PHP y almacena las plantillas en cache, debes ejecutar el siguiente comando cada vez que finalices de desarrollar tu directiva personalizada.
php artisa view:clear
Versión de Laravel disponible
Las directivas personalizadas de Blade están disponibles desde Laravel 4.2, pero fueron cambiando sus métodos. El método directive() se puede utilizar desde Laravel 5.1 y el método if() fue incluida en la versión 5.5 de Laravel. Cualquier duda, puedes consultar la documentación oficial de Laravel.
Conclusión
Esto es todo lo que necesita saber para crear tus propias directivas Blade. Si ya tienes las tuyas propias sería genial que las compartas con la comunidad de Laravel Tip en los comentarios de este artículo. Nos vemos en la próxima. 😉🤙
Buenas. Muy muy buen post, me dió ideas y estaba implementandolo pero tengo un problema. Verás cuando a una directiva se le pasa un parámetro como string me va bien, pero si por ejemplo a una directiva le paso @directivaprueba({{Auth::user()->id}}) no me lo interpreta… es decir en el AppServiceProvider me lleva como String y NO con su valor transdormado… Como se puede lograr esto?.
Muchas gracias Jacobo. Si, todo lo que le pases a la directiva lo interpreta como string. Debes pasarle el valor o, en el caso de Auth, podes usar Auth directamente en la directiva, como hice en el ejemplo de directiva con condición. Saludos.