这里是一个例子:
今天,我遇到了一种情况,我需要从ServiceA到ServiceB调用某些函数,但同样需要其他方法。 Laravel有什么问题吗,或者我在依赖注入方面做了一些不好的练习?
我添加了一个示例示例,该示例在某种程度上类似于我的实际代码库。如果我缺少什么,请回复。
谢谢!
控制器:
class ExampleController extends Controller
{
private $serviceA;
private $serviceB;
public function __construct(
ServiceA $serviceA,
ServiceB $serviceB
)
{
$this->serviceA = $serviceA;
$this->serviceB = $serviceB;
}
}
服务A:
class ServiceA
{
private $serviceB;
public function __construct(ServiceB $serviceB)
{
$this->serviceB = $serviceB;
}
}
服务B:
class ServiceB
{
private $serviceA;
public function __construct(ServiceA $serviceA)
{
$this->serviceA = $serviceA;
}
}
答案 0 :(得分:1)
使用Laravel容器创建对象的新实例时,它会检查那些对象的依赖性,并从容器中注入绑定的实例,或者在可能的情况下通知新实例。
在这种情况下,当Laravel尝试创建控制器的新实例时,它将看到它需要ServiceA。如果ServiceA未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceA的依赖项,并确定它需要ServiceB。如果ServiceB未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceB的依赖项,并确定它需要ServiceA。如果ServiceA未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceA的依赖项,并确定它需要ServiceB。如果ServiceB未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceB的依赖项,并确定它需要ServiceA。如果ServiceA未绑定在容器中,它将尝试创建一个新实例……您明白了。
通常,当您有两个彼此依赖的类时,这意味着每个类中都有可能属于第三(或第四...)类的功能。如果可以,请尝试识别此功能并将其拆分为ServiceA和ServiceB都依赖的ServiceC,而不是彼此分开。