【发布时间】:2018-03-29 23:53:14
【问题描述】:
我已经开始关注 Laravel,但我对项目中的依赖关系管理有些疑问。假设我有依赖
DependencyA 使用 DependencyB 使用 DependencyC:
<?php
namespace Some\NamespaceOf;
use Illuminate\Container\Container;
class DependencyA {
public function someMethod(DependencyB $b, Container $container) {
$container->call([$b, 'doSomething']);
}
}
class DependencyB {
public function doSomething(DependencyC $c) {
// ... do something with $c
}
}
然后,在我的控制器中:
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
use Some\NamespaceOf\DependencyA;
use Illuminate\Container\Container;
class SomeController extends Controller
{
// ...
/**
* @param DependencyA $a
* @return Response
*/
public function controllerMethod(DependencyA $a, Container $container)
{
$container->call([$a, 'someMethod']);
// ...
}
// ...
}
我不喜欢在我的组件之间反复传递控制器。
在这种情况下,最好的重构是什么?将控制器重写为:
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
use Some\NamespaceOf\DependencyA;
use Some\NamespaceOf\DependencyB;
use Illuminate\Container\Container;
class SomeController extends Controller
{
// ...
/**
* @param DependencyA $a
* @return Response
*/
public function controllerMethod(DependencyA $a, DependencyB $b)
{
$a->someMethod($b);
// ...
}
// ...
}
这还不够,因为DependencyA 还需要容器在调用$b->doSomething() 之前查找DependencyC,然后将其传递给$c。我也必须编辑DependencyA,但是我怎样才能将DependencyC 注入它呢?
当这些依赖形成时应该怎么做?
在组件中使用容器让我觉得 IoC 原则被违反了。
感谢您的关注。
【问题讨论】:
-
尽量不要将你的依赖作为参数发送。
-
我认为这是唯一的方法,不是吗。但后来我觉得我失去了“语义”,但也许这只是我做的一个错误的结论,我不必关注......
标签: php laravel dependency-injection inversion-of-control