首页 > 解决方案 > Laravel 中具有静态方法的门面与类

问题描述

我正在查看 Laravel 框架和他们的一些产品,我注意到 Cashier 使用带有静态方法的 Cashier 类,而 Socialite 则用作外观。

以一种或另一种方式构建它有什么好处/缺点,或者根本没有?我想自己构建一些东西,但是如果将其构建为外观是更好的解决方案,我不想开始将其构建为具有静态方法的类。

标签: laravelclassstaticpackagefacade

解决方案


当您可能需要多个实现时,可以通过外观定义单个接口以简化代码

使用静态方法将其构建为类:

当您有多个课程时,您必须执行以下操作:

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

另外,门面更容易测试,检查:

https://laravel.com/docs/5.8/facades#how-facades-work


推荐阅读