Facades 与 类 在 Laravel 中使用静态方法

Facades vs. Classes with static methods in Laravel

我正在查看 Laravel 框架和他们的一些产品,我注意到 Cashier 正在使用 Casheir class 静态方法,而 Socialite 则用作门面。

以这种或另一种方式构建它有哪些 benefits/downsides,或者根本没有 none? 我想自己构建一些东西,但我不想开始使用静态方法将其构建为 class 如果将其构建为外观是更好的解决方案。

当你可能需要多个实现时,可以通过facade定义一个接口来简化代码

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

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

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