Personalizar declaraciones IF en Blade - Laravel 5.5

Personalizar declaraciones IF en Blade - Laravel 5.5

Usando Blade podemos definir nuestras propias directivas (directivas personalizadas). Lo logramos utilizando el método Blade::if. Nosotros podríamos crear nuestros @admin, @check, @subscriber y los que necesitemos... Pensar en esto puede hacer que pienses en que es complicado. Por ese motivo, Blade proporciona un método Blade::if, observa es muy rápido utilizando Closures. Veamos cómo lograrlo...


¿Que prefieres en tus vistas...?

¿Esto?

<!doctype html>
<html lang="es">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        @if(auth()->check() && auth()->user()->is_subscriber)
            <p>Hola {{ auth()->user()->name }}, gracias por estar suscrito</p>
        @endif
    </body>
</html>

¿O esto?

<!doctype html>
<html lang="es">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        @subscriber
            <p>Hola {{ auth()->user()->name }}, gracias por estar suscrito</p>
        @endsubscriber
    </body>
</html>

Para el ejemplo usamos is_subscriber y hacemos referencia a que es un campo boolean; true si esta suscrito y false si no lo está.

Seguramente escogiste la segunda opción, pues es mas limpio y se entiende mejor. Crear nuevas directivas IF de Blade (es decir condicionales personalizados) no es algo nuevo. De hecho, puedes crear esta directiva aun teniendo Laravel 5.1, pero el Laravel 5.5 es mucho más fácil, rápido y práctico...

Vamos a enfocarnos en la novedad de Laravel 5.5 que es LTS y de momento nos interesa, como te mencioné es mas fácil crear nuevas directivas IF con el método Blade::if(). Mira este ejemplo que reemplaza el código anterior: Archivo app/Providers/AppServiceProvider.php

<?php

    namespace App\Providers;

    use Illuminate\Support\ServiceProvider;
    use Illuminate\Support\Facades\Blade;

    class AppServiceProvider extends ServiceProvider
    {
        
        public function boot()
        {
            Blade::if('subscriber', function () {
                return auth()->check() && auth()->user()->is_subscriber;
            });
        }

        public function register()
        {
            //
        }
    }

¿Verdad que resulta mas simple y fácil de entender? Este método recibe como primer parámetro el nombre de la nueva directiva (en este caso es subscriber, que podrás usar como @subscriber y @endsubscriber, y como segundo parámetro una función anónima donde se pone la lógica que después debe de retorná true o false. En este caso, la función devolverá true solo si el usuario inicio sesión, y si su propiedad subscriber es true.

Ahora veamos qué mas puede hacer este método.

Digamos que deseas algo así en tu vista.

<!doctype html>
<html lang="es">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        @role('admin')
            <p>Hola eres un admin y todo lo que tenga que ver contigo aparecerá aquí</p>
        @endrole
    </body>
</html>

En la función anónima podemos recibir estos parámetros que pasamos a través de las directiva @role. Veamos el código.

<?php

    namespace App\Providers;

    use Illuminate\Support\ServiceProvider;
    use Illuminate\Support\Facades\Blade;

    class AppServiceProvider extends ServiceProvider
    {
        
        public function boot()
        {
            Blade::if('role', function ($role) {
                return auth()->check() && auth()->user()->role == $role;
            });
        }

        public function register()
        {
            //
        }
    }

Aquí la variable $role recibe lo que pasamos en la directiva @role, en este caso es admin. Si el usuario inicio sesión, y si su role es admin, la función devolverá true y se mostrará el mensaje Hola eres un admin y todo lo que tenga que ver contigo aparecerá aquí, sino entonces no aparecerá nada en la vista.

Ahora no solo tienes las directivas @role (el cual acepta un parámetro) y @endrole , sino tambien la directiva @elserole (que tambien acepta un parámetro). El cual puedes usar de la siguiente manera:

<!doctype html>
<html lang="es">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        @role('admin')
            <p>Soy admin</p>
        @elserole('user')
            <p>Soy usuario</p>
        @else
            <p>
                Inicia sesión <a href="{{ url('login') }}">aquí</a>
            </p>
        @endrole
    </body>
</html>

Blade::if no reemplaza totalmente a Blade::directive (el cual también sirve para crear directivas). Pero a la hora de crear nuevos bloques relacionados con IF, este es más sencillo.

Asi que deja volar tu imaginación y crea nuevas directivas IF para tus proyectos.

Descarga aquí el código, recuerda que todo está en Github, regalanos estrellas :)

Adquiere en preventa y aprovecha un gran descuento TDD en Laravel

Comparte en

Creado por: Venezuela Italo Morales

Profesor de #Laravel y #PHP en Rimorsoft Online

Más información


Spatie/Laravel Permission ¿Cómo agregar campos en la tabla "roles"?

Hola, mi consulta es la siguiente:

Relacioné la tabla "roles" con mi tabla** "empresa**", es decir, en la tabla "roles", tengo el campo "id_empresa", en la vista, están los campos necesarios y el select de la empresa pero al querer guardar los datos, me arroja el siguiente error: ** "The given role or permission should use guard web instead of Empresas. "** No ...

SOFTWARE PARA CONSULTORIOS MEDICOS

Hola Amigos. soy nuevo en el grupo.. me gustaria saber si alguien tiene o tuvo algun proyecto basado en laravel, para consultorios medicos? ...

sincronización de componentes hermanos

un gran saludo a la comunidad rimorsorf... espero de su valiosa ayuda para mi problema que es el siguiente:

tengo dos componentes en el mismo nivel, el primero crea una tabla con una lista de procesos por tramitar y el segundo componente lista en una tabla los procesos que se han asignado para tramitar; cuando en la primera tabla se asigna el proceso este debe desaparecer de...

plantilla blade y vuejs2

buenas noches comunidad, por casualidad alguien sabrá si se puede integrar la plantilla de laravel blade en vuejs2 component??, gracias dee antemano...