建立 Facades

最后更新于:2022-04-01 15:05:14

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