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


crear un radio button que despliegue msj

hola quisiera saber como puedo crear un radio button que cuando lo seleccione me mande un msj de alerta.

mi codigo es el siguiente

---- en mi vista---- {!! Form::label('oobraexte', 'La Obra es:') !!} {!! Form::radio('oobraexte', 'SI', false, ['class'=>'check', 'id'=>'radio1']) !!} ...

recibir un checkbox en el controlador

como puedo recibir un checkbox en el controlador y si esta seleecionado que haga una accion, y si no esta seleccionado que haga otra?, un saludo y gracias...

Enviar arreglos en un input desde html (blade)

Hola a todos actualemente tengo este fragmento de codigo en html dónde envio informacion de un usuario

<!-- cuando es requerido y de tipo checkbox -->
<div class="form-group">
  <div class="col-md-6">
    <label for="{{$tag->tag_name}}" class="col-md-4 control-label">{{$tag->tag_name}}</label>
    <input type="hidden" class="form-control" value="{{$tag->id}}" n...

Como puedo conectarme a múltiples base de datos con laravel

Hola saludos como puedo conectarme a múltiples base de datos y hacer login con los usuarios de cada una de ellas y acceder a la informacion especifica de cual me encuentro iniciada la sesion

Necesito de sua ayuda y orientacíon sobre el tema muchas gracas....