欢迎各位兄弟 发布技术文章
这里的技术是共享的
门面为应用的服务容器中的有效类提供了一个“静态”接口。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)。
下面列出了每个门面及其对应的底层类,这对深入给定根门面的API文档而言是个很有用的工具。服务容器绑定键也被包含进来:
http://laravelacademy.org/post/97.html