Cómo lo explica la documentación oficial de Laravel en palabras muy simples los Facades proporcionan una interfaz «Estática» a clases que están disponibles en el contenedor de servicios de la aplicación. Como tal un «Facade» es un patrón de diseño estructural que permite crear una interfaz simple a un subsistema de la aplicación como pueden ser paquetes o componentes.

El patrón fachada viene motivado por la necesidad de estructurar un entorno de programación y reducir su complejidad con la división en subsistemas, minimizando las comunicaciones y dependencias entre éstos. (Wikipedia)

Laravel, como un framework orientado a objetos, nos proporciona una base muy sólida para crear funcionalidades propias, implementar nuevos paquetes, servicios, componentes y mucho más, de manera que podamos mantener uniformidad en la forma en cómo desarrollamos nuestro código.

En este tutorial vamos a conocer cómo crear una clase para un pequeño componente que pueda ser llamado desde cualquier lugar de la aplicación usando un facade. La finalidad de este tutorial es totalmente didáctica para comprender el funcionamiento de los facades por lo cual no entraremos en detalle en cuanto a la construcción del componente.

Vamos a crear una clase que permita generar etiquetas html similar a como lo hace Laravel Collective o el componente Styde/Html.

Creando la clase

El primer paso será crear la clase de este componente, la llamaremos HtmlGenerator.php  y podemos crearla dentro de un nuevo directorio llamado Components (app/Components/HtmlGenerator.php).

<?php
namespace App\Components;

use Illuminate\Support\Facades\URL;

class HtmlGenerator
{

    public function link($url = null, $name = null, $class = null)
    {
    	$url = URL::to($url, [], null);
        // si no tenemos el $name pero tenemos $url
        if (isset($url) && is_null($name)) {
            $name = $url;
        }
        return view('HtmlGenerator.link', compact('name', 'url', 'class'));
    }
}

No olvides agregar el namespace en la cabecera del archivo namespace App\Components;

El método link() devuelve una vista que contiene el código html del objeto que deseamos generar, en este caso una etiqueta <a></a>.

Crearemos esta vista dentro de resources/views/HtmlGenerator/link.blade.php

<a href="{{ $url }}" @if(isset($class)) class = "{{ $class }}" @endif>{{ $name }}</a>

Creando un nuevo Service Provider

Posteriormente necesitamos crear un service provider para que la clase esté disponible en el contenedor de servicios de la aplicación. Esto lo podemos hacer desde la consola usando artisan:

$ php artisan make:provider HtmlGeneratorServiceProvider

Dentro del método register le indicamos al Service Provider la clase que queremos incluir. El contenido final de este archivo será algo similar a esto:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider;

class HtmlGeneratorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        \App::bind('build', function()
        {
            return new \App\Components\HtmlGenerator;
        });
    }
}

Una vez creado debemos registrarlo en el array de providers dentro de config/app.php:

App\Providers\HtmlGeneratorServiceProvider::class,

Creando un nuevo Facade

Siguiendo la misma línea, lo más conveniente para esto tal vez sea crear un nuevo directorio llamado Facades para mantener un poco más organizados nuestros archivos, entonces crearemos una nueva clase app/Facades/HtmlGenerator.php. No te preocupes por usar el mismo nombre de archivo de la clase anterior, en este caso usaremos un namespace diferente, por lo cual no deberá haber ningún problema.

<?php

namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class HtmlGenerator extends Facade {

    protected static function getFacadeAccessor()
    {
        return 'build';
    }
}

Esto devolverá una nueva instancia de la clase «HtmlGenerator» que creamos primeramente, cada vez que llamemos a la clase a través del facade Build, ya solo nos queda registrar el facade en config/app.php.

'Build' => App\Facades\HtmlGenerator::class

Resultado final

Finalmente, si usamos boostrap podremos crear un link usando las clases pre-definidas en el framework desde cualquier vista de Blade con lo siguiente:

{!! Build::link('https://styde.net', 'Go to Styde.Net', 'btn btn-success') !!}

Recuerda usar las nuevas etiquetas de Blade {!! !!} para no escapar las etiquetas html que queremos usar.

Con esto logramos obtener en el navegador:

Capture

Espero que te haya gustado este pequeño tutorial, cuya finalidad, como lo mencionamos al principio de este tutorial, es el de servirte como guía para crear tus propios facades, pero si lo que realmente te interesa es crear componentes geniales para tus aplicaciones, no solo de Laravel, sino para cualquier aplicación de PHP entonces debes registrarte ahora mismo en el Curso de creación de componentes para PHP y Laravel

curso-componentes-laravel-php

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Laravel 5.1 Guía rápida para principiantes Lección siguiente Rutas con filtros en Laravel 5.1