Blog / Laravel / Extender Blade con nuevas directivas
Se pueden añadir nuevas directivas a Blade para su uso en los templates permitiéndonos "limpiarlos", como inconveniente todo lo que reciben es un string, con independencia del dato de entrada.
Se pueden añadir nuevas directivas a Blade para su uso en los templates permitiéndonos "limpiarlos", como inconveniente todo lo que reciben es un string, con independencia del dato de entrada.
Voy a usar directivas para mostrar
IVA: 21% - 42,00 €
en la página. Usaré, por ejemplo:
@iva(21) - @euro(42)
Podemos añadir las directivas en el método
boot()
de un provider, ya sea en AppServiceProvider
o creando uno nuevo ex profeso.
Lo mejor será optar por la segunda opción.
php artisan make:provider BladeServiceProvider
Lo registramos en la configuración: "config/app.php", en el grupo de service providers.
'providers' => [
...
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\BladeServiceProvider::class,
],
En el método boot()
del nuevo provider introducimos:
Blade::directive('iva', function ($str) {
return 'IVA: ' . $str . '%';
});
Blade::directive('euro', function ($str) {
return $str . ' €';
});
Antes de la declaración de la clase, hay que cargar "Blade":
use Illuminate\Support\Facades\Blade;
Guardar todo.
Regenerar el autoload:
composer dump-autoload
Si las directivas ya están en el template, al recargar la página deberíamos ver lo esperado.
Para mostrar bloques de código uso el HTML:
<pre>
<code class="code-box">
...
</code>
</pre>
o:
<code class="inline-code">
...
</code>
Voy a crear las directivas para que Blade añada este HTML por mí.
En el método boot()
del service provider que cree en el ejemplo anterior, añadiré:
Blade::directive('code', function () {
return '<pre><code class="code-box">';
});
Blade::directive('endcode', function () {
return '</pre></code>';
});
Blade::directive('icode', function (string $str) {
return '<code class="inline-code">' . $str . '</code>';
});
Guardo y regenero el autoload.
Desde ahora, para escribir bloques de código escribiré:
@code
...
@endcode
o bien:
@green(...)
Blade::directive('lang', function ($expression) {
return "$expression";
});
Use it like this:
messages.welcome
15-11-2020