想象一下,我们有一个Request
对象和一个Controller
对象。该Controller
对象是用一个Request
对象构造的,如下所示:
abstract class Controller {
public $request;
public function __construct(Request $request)
{
$this->request = $request;
}
}
如您所见,这是一个抽象类,因此实际上Controller
将构造一个子类。让我们想象一下代码是这样的:
// Instantiate the request.
$request = new Request($params);
// Instantiate the registration controller.
$controller = new RegistrationController($request);
现在假设我们向我们的 . 添加一个依赖项RegistrationController
,如下所示:
class RegistrationController extends Controller {
private $user_repo;
public function __construct(Request $request, UserRepo $user_repo)
{
parent::__construct($request);
$this->user_repo = $user_repo;
}
}
此时,我想做的是引入一个依赖注入容器,通过构造函数自动注入依赖。为此,我一直在使用PHP-DI。通常,这会是这样的:
// Instantiate the registration controller.
$controller = $container->get('RegistrationController');
然后,这将RegistrationController
使用 的实例Request
和 的实例进行实例化UserRepo
。由于反射,它知道用这些对象构建,但如果我愿意,我也可以通过配置文件覆盖它。
问题是该Request
对象采用动态参数。我需要Request
传递给的对象RegistrationController
是一个特定的实例,一个我刚刚创建的实例。
我基本上希望能够说:“给我一个这个类的实例,它的所有依赖项都注入了,但是对于一个特定的参数,传入这个特定的实例”。
我已经查看了PHP-DI(以及一大堆其他 DI 容器)是否支持特定参数的这种“覆盖”,但到目前为止我找不到任何东西。
我想知道的是:
- 那里有可以做到这一点的 DI 容器吗?
- 是否有另一种方法可以使类保持干净(我不想使用注释或其他任何会添加我用作依赖项的容器的方法)?