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