Facade
根据 Dictionary.com 的说法,“facade” 这个词指的是“某种东西的表面或者幻觉”。 在建筑学中,这个术语指的是建筑物的正面。
Laravel 中的 facade 是一个将静态方法调用重定向到底层类的动态方法的类。 Facade 的目标是为访问底层类的功能提供一种令人难忘且富有表现力的语法。
一个使用 facade 的流畅 API 的例子:
MessageFactory::sentBy($user)
->withTopic('Example message')
->withMessage($body)
->withReply($replyByFrank)
->create();
Facade 是如何工作的
要了解更多关于Facade及其工作方式的信息,请参考优秀的Laravel 文档。
如何创建Facade
让我们假设我们提供了一个 Calculator
类作为包的一部分,并希望使这个类作为 facade 可用。
首先在 src/
目录中创建 Calculator.php
文件。 为了简单点,计算器提供了一个 add()
, subtract()
和 clear()
方法。 所有方法都返回对象本身,从而允许一个流式的 API (链式方法调用,比如:->add()->subtract()->subtract()->result()
)。
// 'src/Calculator.php'
<?php
namespace JohnDoe\BlogPackage;
class Calculator
{
private $result;
public function __construct()
{
$this->result = 0;
}
public function add(int $value)
{
$this->result += $value;
return $this;
}
public function subtract(int $value)
{
$this->result -= $value;
return $this;
}
public function clear()
{
$this->result = 0;
return $this;
}
public function getResult()
{
return $this->result;
}
}
除了这个类,我们将在一个新的 src/facades 文件夹中创建 facade:
// 'src/Facades/Calculator.php'
<?php
namespace JohnDoe\BlogPackage\Facades;
use Illuminate\Support\Facades\Facade;
class Calculator extends Facade
{
protected static function getFacadeAccessor()
{
return 'calculator';
}
}
最后,我们在服务提供者的服务容器中注册绑定:
// BlogPackageServiceProvider.php
namespace JohnDoe\BlogPackage;
public function register()
{
$this->app->bind('calculator', function($app) {
return new Calculator();
});
}
在从适当的名称空间导入 Calculator
facade 后,终端用户现在可以使用 Calculator
facade: use JohnDoe\BlogPackage\Facades\Calculator;
。 但是,Laravel 允许我们注册一个别名,该别名可以在根命名空间中注册 facade。 我们可以在 composer.json 文件的 "providers" 下面的 "alias" 键下定义我们的别名:
"extra": {
"laravel": {
"providers": [
"JohnDoe\\BlogPackage\\BlogServiceProvider"
],
"aliases": {
"Calculator": "JohnDoe\\BlogPackage\\Facades\\Calculator"
}
}
}
我们的 facade 现在不再需要导入,并且可以从根命名空间在项目中使用。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: