之前,我已经看到了很多代码来证明服务提供商,但是我仍然有一些问题
示例代码:
<?php
namespace App\Http\Controllers\Test;
use App\Http\Controllers\Controller;
class Test extends Controller
{
// simple case
public function __construct(\SomeClass $class)
{
$this->class = $class;
}
// vs
public function __construct()
{
$this->class = new \SomeClass();
}
我看到的大多数代码都说类是否复杂:
public function __construct()
{
$this->class = new \SomeClass(new Bar(), new Foo('other dependence'));
}
// then they said provider can solve it like:
$this->app->bind('SomeClass', function(){
return new \SomeClass(new Bar(), new Foo('other dependence'));
});
// and use like follow:
public function __construct(\SomeClass $class)
{
$this->class = $class;
}
}
所以我的问题是:
如果类是获取实例所必需的
为什么不在SomeClass,Bar和Foo中做相同的事情(新实例):
class SomeClass
{
public function __construct()
{
$this->bar = new Bar();
$this->foo = new Foo();
}
}
class Bar
{
public function __construct()
{
}
}
class Foo
{
public function __construct()
{
$this->other_dep = new OtherDependence();
}
}
然后,我仍然可以像第一次编写的那样进行编码:
public function __construct()
{
$this->class = new \SomeClass();
// now it's equal to
// $this->class = new \SomeClass(new Bar(), new Foo('other dependence'));
}
答案 0 :(得分:0)
对于$this->app->bind
,当您从构造器__construct(\SomeClass $class)
或app('SomeClass')
或resolve('SomeClass')
释放类时,这将告诉Laravel如何创建该类的实例。如果您的类没有复杂的依赖关系,那么我会坚持使用$this->class = new \SomeClass();
,因为SomeClass
不需要创建任何其他对象。当您执行__construct(\SomeClass $class)
时,这将自动解决所有依赖关系,这些依赖关系对于Laravel来说很简单,例如类名,而不是接口。