Facades

Introdução

As facades fornecem uma interface "static" para classes que estão disponíveis no service container da aplicação. O Laravel vem com muitas facades a bordo, e você provavelmente as tem utilizado mesmo sem conhecê-las! As "facades" Laravel funcionam como "static proxies" para classes subjacentes no service container, fornecendo o benefício de uma sintaxe concisa e expressiva, enquanto mantém maior capacidade de testes e flexibilidade que os métodos estáticos tradicionais.

Usando Facades

No contexto de uma aplicação Laravel, a facade é uma classe que fornece acesso a um objeto do container. O mecanismo que realiza esse trabalho está na classe Facade. As facades do Laravel, e quaisquer facades customizadas que você criar, irão estender a classe base Illuminate\Support\Facades\Facade.

Uma classe facade precisa implementar apenas um único método: getFacadeAccessor. É responsabilidade do métodogetFacadeAccessor definir o que resolver a partir do container. A classe base Facade faz uso do método mágico __callStatic() para enviar chamadas da sua facade para o objeto resolvido.

No exemplo abaixo, uma chamada é feita para o sistema de cache do Laravel. Ao olharmos para este código, podemos supor que o método estático get está sendo chamado na classe Cache:

<?php

namespace App\Http\Controllers;

use Cache;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        $user = Cache::get('user:'.$id);

        return view('profile', ['user' => $user]);
    }
}

Observe que próximo do topo do arquivo nós estamos "importando" a facade Cache. Esta facade funciona como um proxy para acessar a implementação subjacente da interface Illuminate\Contracts\Cache\Factory. Qualquer chamada que fizermos usando a facade será repassada para a instância subjacente do cache service do Laravel.

Se olharmos para a classe Illuminate\Support\Facades\Cache, você verá que não há um método estático get:

class Cache extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'cache'; }
}

Em vez disso, a facade Cache estende a classe base Facade e define o método getFacadeAccessor(). Lembre-se, a responsabilidade deste método é retornar o nome da ligação para o service container. Quando um usuário faz referência a qualquer método estático na facade Cache, o Laravel resolve a ligação de cache a partir do service container e executa o método solicitado (neste caso, get) através daquele objeto.

Referência de Classe Facade

Abaixo você irá encontrar cada facade e sua classe subjacente. Esta é uma ferramenta útil para rapidamente realizar um estudo aprofundado na documentação da API para uma determinada facade base. A chave para o service container binding também está inclusa quando for aplicável.

Facade Class Service Container Binding
App Illuminate\Foundation\Application app
Artisan Illuminate\Console\Application artisan
Auth Illuminate\Auth\AuthManager auth
Auth (Instance) Illuminate\Auth\Guard
Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
Bus Illuminate\Contracts\Bus\Dispatcher
Cache Illuminate\Cache\Repository cache
Config Illuminate\Config\Repository config
Cookie Illuminate\Cookie\CookieJar cookie
Crypt Illuminate\Encryption\Encrypter encrypter
DB Illuminate\Database\DatabaseManager db
DB (Instance) Illuminate\Database\Connection
Event Illuminate\Events\Dispatcher events
File Illuminate\Filesystem\Filesystem files
Hash Illuminate\Contracts\Hashing\Hasher hash
Input Illuminate\Http\Request request
Lang Illuminate\Translation\Translator translator
Log Illuminate\Log\Writer log
Mail Illuminate\Mail\Mailer mailer
Password Illuminate\Auth\Passwords\PasswordBroker auth.password
Queue Illuminate\Queue\QueueManager queue
Queue (Instance) Illuminate\Queue\QueueInterface
Queue (Base Class) Illuminate\Queue\Queue
Redirect Illuminate\Routing\Redirector redirect
Redis Illuminate\Redis\Database redis
Request Illuminate\Http\Request request
Response Illuminate\Contracts\Routing\ResponseFactory
Route Illuminate\Routing\Router router
Schema Illuminate\Database\Schema\Blueprint
Session Illuminate\Session\SessionManager session
Session (Instance) Illuminate\Session\Store
Storage Illuminate\Contracts\Filesystem\Factory filesystem
URL Illuminate\Routing\UrlGenerator url
Validator Illuminate\Validation\Factory validator
Validator (Instance) Illuminate\Validation\Validator
View Illuminate\View\Factory view
View (Instance) Illuminate\View\View