架构 ―― 门面

1、简介

门面为应用的服务容器中的有效类提供了一个“静态”接口。Laravel附带了很多门面,你可能在不知道的情况下正在使用它们。Laravel的门面作为服务容器中的底层类的“静态代理”,相比于传统静态方法,在维护时能够提供更加易于测试、更加灵活的、简明且富有表现力的语法。

2、使用门面

在Laravel应用的上下文中,门面就是一个提供访问容器中对象的类。该机制原理由Facade类实现,Laravel自带的门面,以及创建的自定义门面,都会继承自IlluminateSupportFacadesFacade基类。

门面类只需要实现一个方法:getFacadeAccessor。正是getFacadeAccessor方法定义了从容器中解析什么,然后Facade基类使用魔术方法从你的门面中调用解析对象。

下面的例子中,我们将会调用Laravel的缓存系统,浏览代码后,也许你会觉得我们调用了Cache的静态方法get

<?php

namespace AppHttpControllers;

use Cache;
use AppHttpControllersController;

class UserController extends Controller{
    /**
     * 为指定用户显示属性
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        $user = Cache::get("user:".$id);

        return view("profile", ["user" => $user]);
    }
}

注意我们在顶部位置引入了Cache门面。该门面作为代理访问底层IlluminateContractsCacheFactory接口的实现。我们对门面的所有调用都会被传递给Laravel缓存服务的底层实例。

如果我们查看IlluminateSupportFacadesCache类的源码,将会发现其中并没有静态方法get

class Cache extends Facade{
    /**
     * 获取组件注册名称
     *
     * @return string
     */
    protected static function getFacadeAccessor() { 
        return "cache"; 
    }
}

Cache门面继承Facade基类并定义了getFacadeAccessor方法,该方法的工作就是返回服务容器绑定类的别名,当用户引用Cache类的任何静态方法时,Laravel从服务容器中解析cache绑定,然后在解析出的对象上调用所有请求方法(本例中是get)。

扩展阅读:实例教程 —— 创建自定义Facades类

3、门面类列表

下面列出了每个门面及其对应的底层类,这对深入给定根门面的API文档而言是个很有用的工具。服务容器绑定键也被包含进来:

门面 服务容器绑定别名
App IlluminateFoundationApplication app
Artisan IlluminateConsoleApplication artisan
Auth IlluminateAuthAuthManager auth
Auth (Instance) IlluminateAuthGuard
Blade IlluminateViewCompilersBladeCompiler blade.compiler
Bus IlluminateContractsBusDispatcher
Cache IlluminateCacheRepository cache
Config IlluminateConfigRepository config
Cookie IlluminateCookieCookieJar cookie
Crypt IlluminateEncryptionEncrypter encrypter
DB IlluminateDatabaseDatabaseManager db
DB (Instance) IlluminateDatabaseConnection
Event IlluminateEventsDispatcher events
File IlluminateFilesystemFilesystem files
Hash IlluminateContractsHashingHasher hash
Input IlluminateHttpRequest request
Lang IlluminateTranslationTranslator translator
Log IlluminateLogWriter log
Mail IlluminateMailMailer mailer
Password IlluminateAuthPasswordsPasswordBroker auth.password
Queue IlluminateQueueQueueManager queue
Queue (Instance) IlluminateQueueQueueInterface
Queue (Base Class) IlluminateQueueQueue
Redirect IlluminateRoutingRedirector redirect
Redis IlluminateRedisDatabase redis
Request IlluminateHttpRequest request
Response IlluminateContractsRoutingResponseFactory
Route IlluminateRoutingRouter router
Schema IlluminateDatabaseSchemaBlueprint
Session IlluminateSessionSessionManager session
Session (Instance) IlluminateSessionStore
Storage IlluminateContractsFilesystemFactory filesystem
URL IlluminateRoutingUrlGenerator url
Validator IlluminateValidationFactory validator
Validator (Instance) IlluminateValidationValidator
View IlluminateViewFactory view
View (Instance) IlluminateViewView
文章导航