Laravel自动注入和在构造函数主体中手动指定依赖项之间有什么区别?

雷达洛

我在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TFS中的手动和自动结帐有什么区别?

在ASP.NET Core中间件构造函数中混合依赖项注入和手动传递的参数

使用closePath函数关闭贝塞尔曲线路径与手动关闭它之间有什么区别?

systemd 服务的自动启动和手动启动有什么区别?

composer require与手动修改composer.json之间有什么区别

手动为字典分配值和使用updateValue函数有什么区别?

Play Framework的ScalaRouting中的依赖项注入路由器和静态路由器之间有什么区别?

通过构造函数注入和使用Guice通过字段注释注入之间有什么区别?

Windows中的“手动”和“禁用”服务有什么区别?

“使用”父类构造函数和在 C++ 中创建一个新的构造函数有什么区别?

Java中的资源注入和依赖注入(CDI)之间有什么区别?

在路由组中分配中间件和在控制器的构造函数中启动它之间有什么区别吗?

在渲染函数之后写一个变量和在构造函数中写“this.name of variable”有什么区别?

实例初始值设定项和构造函数之间有什么区别?

依赖项注入无效,但手动定义

项目和BOM依赖项之间有什么区别?

组件和服务依赖项之间有什么区别?

在ASP.NET Core依赖项注入中手动注册控制器

这两种类型的php中的构造函数注入有什么区别?

@Inject与构造函数注入作为Angular 2中的常规参数有什么区别?

IntelliJ IDEA中的“模块依赖项”和“库”之间有什么区别?

pom xml中的依赖项标签和插件标签之间的maven有什么区别?

Play 2.4中的插件,依赖项,模块和子项目之间有什么区别?

通过Synaptic安装指定手动安装的依赖项

CDI(上下文和依赖注入)和DI(依赖注入)之间有什么区别

JavaScript中的函数和构造函数之间有什么区别?

Javascript-这些构造函数之间有什么区别?

这些 FormData 构造函数之间有什么区别?

在类主体中设置$ this-> something,不能使用构造函数依赖项注入