Facades

Introduction

Facades provide a "static" interface to classes that are available in the application's service container. Laravel ships with many facades, and you have probably been using them without even knowing it! Laravel "facades" serve as "static proxies" to underlying classes in the service container, providing the benefit of a terse, expressive syntax while maintaining more testability and flexibility than traditional static methods.

Using Facades

In the context of a Laravel application, a facade is a class that provides access to an object from the container. The machinery that makes this work is in the Facade class. Laravel's facades, and any custom facades you create, will extend the base Illuminate\Support\Facades\Facade class.

A facade class only needs to implement a single method: getFacadeAccessor. It's the getFacadeAccessor method's job to define what to resolve from the container. The Facade base class makes use of the __callStatic() magic-method to defer calls from your facade to the resolved object.

In the example below, a call is made to the Laravel cache system. By glancing at this code, one might assume that the static method get is being called on the Cache class:

<?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]);
    }
}

Notice that near the top of the file we are "importing" the Cache facade. This facade serves as a proxy to accessing the underlying implementation of the Illuminate\Contracts\Cache\Factory interface. Any calls we make using the facade will be passed to the underlying instance of Laravel's cache service.

If we look at that Illuminate\Support\Facades\Cache class, you'll see that there is no static method get:

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

Instead, the Cache facade extends the base Facade class and defines the method getFacadeAccessor(). Remember, this method's job is to return the name of a service container binding. When a user references any static method on the Cache facade, Laravel resolves the cache binding from the service container and runs the requested method (in this case, get) against that object.

Facade Class Reference

Below you will find every facade and its underlying class. This is a useful tool for quickly digging into the API documentation for a given facade root. The service container binding key is also included where applicable.

Facade | Class | Service Container Binding ------------- | ------------- | ------------- App | Illuminate\Foundation\Application | app Artisan | Illuminate\Contracts\Console\Kernel | artisan Auth | Illuminate\Auth\AuthManager | auth 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 Gate | Illuminate\Contracts\Auth\Access\Gate | Hash | Illuminate\Contracts\Hashing\Hasher | hash 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\Contracts\Queue\Queue | queue 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 |