网关和存储库模式 PHP Laravel

Gateway and repository pattern PHP Laravel

我想问一下设计模式

为什么我应该在构造函数中使用依赖注入,而不是导入它 ('use statement')?

例如:

在我的控制器中:

class AuthController extends Controller {

    public function __construct(UserGateway $userGateway)
    {
        $this->userGateway = $userGateway;
    }

    public function doSomething()
    {
        $this->userGateway->foo();
    }

}

为什么不这样使用呢?

use Acme\UserGateway;
class AuthController extends Controller {

    public function doSomething()
    {
        UserGateway::foo();
    }

}

非常感谢。

假设 UserGateway 不是 laravel 门面:这是以这种方式注入内容的最大优势:将来,您可能会重新定义 UserGateway 实际上是什么,并提供其他一些 class(通常是子class)而不是像这样:

$this->app->bind(UserGateway::class, function ($app) {
    return new NewUserGateway();
});

这对于覆盖代码的某些部分非常有用,尤其是当您在多个项目中使用相同的包时。而且它不需要您更改 AuthController 的代码。

如果 UserGateway 是 Facade,您将获得的唯一好处是更好的代码导航 IDE,因为它会知道 class 您究竟引用了什么(假设你没有重新绑定它)。