laravel - Laravel 中具有静态方法的门面与类
问题描述
我正在查看 Laravel 框架和他们的一些产品,我注意到 Cashier 使用带有静态方法的 Cashier 类,而 Socialite 则用作外观。
以一种或另一种方式构建它有什么好处/缺点,或者根本没有?我想自己构建一些东西,但是如果将其构建为外观是更好的解决方案,我不想开始将其构建为具有静态方法的类。
解决方案
当您可能需要多个实现时,可以通过外观定义单个接口以简化代码
使用静态方法将其构建为类:
当您有多个课程时,您必须执行以下操作:
CashierOne::method, CashierTwo::method ....
用作门面:
根据你绑定的容器切换实现只需要通过一个接口调用即可:
// Define a Cashier Facade
class Cashier extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'cashier';
}
}
// In CashServiceProvider
$this->app->singleton('cashier', function ($app) {
return new CashierManager ($app);
});
// In CashierManager
public function gateway($name = null)
{
// get cashier implementation by name
}
public function __call($method, $parameters)
{
return $this->gateway()->$method(...$parameters);
}
// In Controller
Cashier::method
另外,门面更容易测试,检查:
推荐阅读
- typescript - Quasar QTable的行和列的类型脚本定义
- html - 将 Bootstrap 3 轮播适配到 Bootstrap 5 时 CSS 中断
- java - 在 Java NIO 中,为什么 selector.selectedKeys() 的设计方式必须手动删除已处理的密钥?
- python - 有没有办法使用 MLP/任何其他将目标函数和误差函数作为输入并返回最佳参数的算法?
- node.js - 如何在 Azure 上为 SSR Angular 设置 NODE_TLS?
- javascript - TypeScript:如何确保功能组件的两个道具(数组)具有相同的长度?
- android - 在 garuda linux 上安装 android studio
- python - 从文本文件中提取单词
- r - 删除 Tidyverse 中的不正确标签/限制 as_factor() 的操作
- linux - 尝试删除 git 存储库中的 git 存储库时无法删除 sub-sub....-sub 文件夹