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


Validación de registros duplicados en tabla intermedia

Hola,

Necesito de su ayuda estoy tratando que un request valide un registro para que no sea repetido, este esta compuesto por tres llaves foraneas(instituto_id, carrera_id, campus_id). les dejo el request: ```php return [ 'instituto_id' => 'required|numeric|min:1', 'carrera_id' => 'required|numeric|min:1', ...

El auth de laravel trabaja con $_SESSION?.

el auth de laravel trabaja basado en tokens o con el objeto session de php ...

Rutas de Laravel no funcionan

Buenas a todos, tengo un problema, ultimamente, cada vez que creo un nuevo proyecto de Laravel las rutas de este no funcionan. Por ejemplo: si creo el proyecto, éste se crea, pero al agregarle el sistema de autenticación: "auth" se generan tanto las rutas en el archivo web.php y las vistas. pero si intento acceder a la sección de registro o inicio de sesión me aparece el e...

form request ajax laravel (Mostrar error de validación de formulario con ajax)

Hola, tengo una consulta por hacer. Quisiera conocer sus opiniones, sobre como mostrar los errores de validación con ajax cuando utlizo la clase Form Request. Debo decir que el mensaje de registrado con éxito si lo muestra, sin embargo los mensajes de error no los he podido mostrar. Gracias

//FORM REQUEST


public function rules()
    {
        return [
     ...