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.