我在Laravel项目中使用存储库模式。除了以下代码段,官方文档中并未真正解释此模式:
您可以在控制器的构造函数中键入由应用程序定义的存储库。存储库将自动解析并注入到类中。
根据文档,这是我的代码:
class CategoriesController extends Controller
{
protected $repo;
public function __construct(CategoriesRepository $repo)
{
$this->repo = $repo;
}
我已经提示了CategoriesRepository,因此服务容器会自动加载它。
但是,如果我直接创建CategoriesController类的新实例(不使用Service Container),则必须指定我也需要CategoriesRepository的新实例,如下所示:
$example = new CategoriesController(new CategoriesRepository());
现在,让我们假设我编写以下代码。
class CategoriesController extends Controller
{
protected $repo;
public function __construct()
{
$this->repo = new CategoriesRepository();
}
这样,我不必通过服务容器加载该类,也不必通过传递CategoriesRepository的新实例作为参数来调用它,因为它是在构造函数内部自动创建的。
所以,我的问题是:这是不好的做法吗?作为参数的类型提示与在构造函数内部创建新实例之间有什么区别?
这是依赖注入的优点:
复杂的初始化
class MyController {
public function __construct(A $a) { }
}
class A {
public function __construct(B $b) { }
}
class B {
public function __construct(C $c) { }
}
class C {
public function __construct(D $d) { }
}
class D {
public function __construct() { }
}
现在,您可以要求laravel为您创建该类,例如:
$controller = make(MyController::class);
或者您可以执行以下操作:
$controller = new MyController(new A(new B(new C(new D())))));
另外,您可以指定关于如何创建变量的更复杂的规则:
app()->bind(D::class, function ($app) {
$d = new D();
$d->setValueOfSomething($app->make(AnotherClass::class));
return $d;
});
测验
这是依赖注入比手动创建事物的优势之一。另一个是单元测试:
public function testSomeFunctionOfC() {
$this->app->bind(D::class, function () {
$dMock = $this->createMock(D::class);
});
$c = make(C::class);
}
现在,当您创建C时,类D将成为模拟类,您可以确保该类根据您的规范工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句