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
另外,门面更容易测试,检查:
我正在查看 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
另外,门面更容易测试,检查: