Facades

简介

译者注:Facade 中文意为 - 门面,外观,包装器。专有名词的属性多一点,故不采用直译,而是直接做专有名词使用。

Facades 为应用程序的 服务容器 中可用的类提供了一个「静态」接口。Laravel 本身附带许多的 facades,甚至你可能在不知情的状况下已经在使用他们!Laravel 「facades」作为在服务容器内基类的「静态代理」,拥有简洁、易表达的语法优点,同时维持着比传统静态方法更高的可测试性和灵活性。

使用 Facades

在 Laravel 应用程序环境(Context)中,facade 是个提供从容器访问对象的类。Facade 类是这个机制运作的核心部件。Laravel 的 facades,以及任何你创建的自定义 facades,会继承基底 Illuminate\Support\Facades\Facade 类。

facade 类只需要去实现一个方法:getFacadeAccessorgetFacadeAccessor 方法的工作定义是从容器中解析出什么。Facade 基类利用 __callStatic() 魔术方法从你的 facade 延迟调用来解析对象。

在下面的例子,调用了 Laravel 的缓存系统。看了一下这个代码,或许有人认为静态方法 get 是被 Cache 类调用的:

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Cache;
  4. use App\Http\Controllers\Controller;
  5. class UserController extends Controller
  6. {
  7. /**
  8. * 显示指定用户的个人数据。
  9. *
  10. * @param int $id
  11. * @return Response
  12. */
  13. public function showProfile($id)
  14. {
  15. $user = Cache::get('user:'.$id);
  16. return view('profile', ['user' => $user]);
  17. }
  18. }

注意在文件的上方,我们「导入」Cache facade。这个 facade 做为访问底层实现 Illuminate\Contracts\Cache\Factory 接口的代理。我们使用 facade 的任何调用将会发送给 Laravel 缓存服务的底层实例。

如果我们查看 Illuminate\Support\Facades\Cache 类,你会发现没有静态方法 get

  1. class Cache extends Facade
  2. {
  3. /**
  4. * 获取组件的注册名称。
  5. *
  6. * @return string
  7. */
  8. protected static function getFacadeAccessor() { return 'cache'; }
  9. }

相反的,Cache facade 继承了基底 Facade 类以及定义了 getFacadeAccessor() 方法。记住,这个方法的工作是返回服务容器绑定的名称。当用户在 Cache facade 上参考任何的静态方法,Laravel 会从 服务容器 解析被绑定的 cache 以及针对对象运行请求的方法(在这个例子中是 get)。

Facade 类参考

在下方你可以找到每个 facade 及其底层的类。这个工具对于通过指定 facade 的来源快速寻找 API 文档相当有用。可应用的 服务容器绑定 关键字也包含在里面。

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

{note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。

转载请注明:本文档由 Laravel China 社区 [laravel-china.org] 组织翻译。

文档永久地址: http://d.laravel-china.org