建立 Facades

2018-02-24 15:51 更新

为你自己的应用程序或扩展包建立 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 在每一个文件的最上面引入你希望类型提示的类。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号