网关和存储库模式 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 您究竟引用了什么(假设你没有重新绑定它)。
我想问一下设计模式
为什么我应该在构造函数中使用依赖注入,而不是导入它 ('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 您究竟引用了什么(假设你没有重新绑定它)。