Personalizar declaraciones IF en Blade - Laravel 5.5

Personalizar declaraciones IF en Blade - Laravel 5.5

Comparte en

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 :)

Comparte en

Creado por: Venezuela Italo Morales

CEO & Founder de Rimorsoft Online

Más información


Parámetros de tipo objeto en PHP

PHP 3 comentarios

En Rimorsoft hemos ido descubriendo cómo pasar parámetros y asegurarnos de que los tipos sean correctos. Hemos visto un ejemplo muy interesante en post de funciones anónimas, pero no es lo único que podemos hacer.

Herencia de clases - PHP

PHP 4 comentarios

Esto lo entendemos mejor si nos vamos a un diccionario y buscamos la palabra heredar, hay muchas definiciones pero la que aplica es la siguiente:

Componente VUEjs en Laravel

Laravel VUE.js 2 comentarios

Curso de componentes en VUEjs y LARAVEL 5.5, la idea es programar una interfaz que consuma datos de un backend... El componente se creará y se usará desde Laravel.

Clases y Objetos en PHP

PHP 7 comentarios

Las clases nos ayudan a definir una estructura manejable y entendible de nuestro sistema, este termino da vida a los que conocemos como programación orientada a objetos (POO en español, OOP en inglés). La teoría dice, "esto significa que tratas a tu código o partes de él como objetos de la vida real y esto podría resultar muy familiar para nosotros porque nos acerca al mundo tal y como lo conocemos". Aunque parece que esto siempre es confuso.