codecamp

建立 Facades

为你自己的应用程序或扩展包建立 facade 是很简单的。你只需要 3 个东西:

一个服务容器绑定。
一个 facade 类。
一个 facade 别名配置。

让我们来看个例子。这里有一个定义为 PaymentGateway\Payment 的类。

namespace PaymentGateway;

class Payment {

    public function process()
    {
        //
    }

}

我们需要可以从服务容器解析出这个类。所以,让我们来加上一个绑定到服务提供者:

App::bind('payment', function()
{
    return new \PaymentGateway\Payment;
});

注册这个绑定的好方式是建立新的 服务提供者 命名为 PaymentServiceProvider,并把这个绑定加到 register 方法。然后你可以配置 Laravel 从 config/app.php 配置文件加载你的服务提供者。

接下来,我们可以建立我们自己的 facade 类:

use Illuminate\Support\Facades\Facade;

class Payment extends Facade {

    protected static function getFacadeAccessor() { return 'payment'; }

}

最后,如果我们希望,可以在 config/app.php 配置文件为 facade 加个别名到 aliases 数组。现在我们可以在 Payment 类的实例上调用 process 方法。

Payment::process();

自动加载别名的附注

在 aliases 数组中的类在某些实例中不能使用,因为 PHP 将不会尝试去自动加载未定义的类型提示类。如果 \ServiceWrapper\ApiTimeoutException 命别名为 ApiTimeoutException,即便有异常被抛出,在 \ServiceWrapper 命名空间外面的 catch(ApiTimeoutException $e) 将永远捕捉不到异常。类似的问题在有类型提示的别名类一样会发生。唯一的替代方案就是放弃别名并用 use 在每一个文件的最上面引入你希望类型提示的类。

实际用法
模拟 Facades
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

环境配置

系统服务

哈希

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }