建立 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 在每一个文件的最上面引入你希望类型提示的类。