门面为应用的服务容器中的有效类提供了一个“静态”接口。Laravel附带了很多门面,你可能在不知道的情况下正在使用它们。Laravel的门面作为服务容器中的底层类的“静态代理”,相比于传统静态方法,在维护时能够提供更加易于测试、更加灵活的、简明且富有表现力的语法。
使用门面
在Laravel应用的上下文中,门面就是一个提供访问容器中对象的类。该机制原理由Facade类实现,Laravel自带的门面,以及创建的自定义门面,都会继承自 Illuminate\Support\Facades\Facade
基类。
门面类只需要实现一个方法: getFacadeAccessor
。正是 getFacadeAccessor
方法定义了从容器中解析什么,然后Facade基类使用魔术方法从你的门面中调用解析对象。
下面的例子中,我们将会调用Laravel的缓存系统,浏览代码后,也许你会觉得我们调用了Cache的静态方法get:
<?php namespace App\Http\Controllers; use Cache; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 为指定用户显示属性 * * @param int $id * @return Response */ public function showProfile($id) { $user = Cache::get('user:'.$id); return view('profile', ['user' => $user]); } }
注意我们在顶部位置引入了Cache门面。该门面作为代理访问底层 Illuminate\Contracts\Cache\Factory
接口的实现。我们对门面的所有调用都会被传递给Laravel缓存服务的底层实例。
如果我们查看 Illuminate\Support\Facades\Cache
类的源码,将会发现其中并没有静态方法get:
class Cache extends Facade{ /** * 获取组件注册名称 * * @return string */ protected static function getFacadeAccessor() { return 'cache'; } }
Cache门面继承 Facade
基类并定义了 getFacadeAccessor
方法,该方法的工作就是返回服务容器绑定类的别名,当用户引用Cache类的任何静态方法时,Laravel从服务容器中解析cache绑定,然后在解析出的对象上调用所有请求方法(本例中是get)。
门面类列表
如下:
门面 | 类 | 服务器绑定别名 |
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
|
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
|
validator
|
View |
Illuminate\View\Factory
|
view
|
View (Instance) |
Illuminate\View\View
|