我正在尝试使用Symfony Dependancy Injection组件来使我的PHP类更容易进行单元测试。 但是,当我想要的类具有在运行时确定的构造函数参数时,我会陷入困境。必须使用有意义的参数来实例化类。所以我不想使用setter注入。我觉得我不能在这种情况下使用Dependancy Injection,需要重新组织我尝试这样做的方式,但我不确定我需要做什么...
我读到如果我有运行时参数,我应该使用抽象工厂,但我的类也将有$ service参数,这不是运行时参数,我想注入这个,这样当我运行测试时,我可以注入模拟服务。
如果抽象工厂是要走的路,我想知道如何使用抽象工厂与DI,以便我可以注入我的服务。
否则,如果不是抽象工厂,我的其他选择是什么?
class Foo
{
public function myMethod()
{
$container = new ContainerBuilder();
$loader = new PhpFileLoader($container, new FileLocator(__DIR__));
$loader->load('services.php'); //Load the config
$container->compile();
//I don't know how to get a Bar because it has other runtime arguments.
$bar = $container->get('bar');
//...
}
}
class Bar
{
private $service;
public function __construct($userId, $date, $service)
{
$this->service = $service
//...
}
}
service.php(DI容器配置):
$container->register('dao', 'Dao');
$container->register('service', 'Service')
->addArgument(new Reference('dao'));
$container->register('bar', 'Bar')
->addArgument(new Reference('service'));
答案 0 :(得分:3)
你可以创建一个这样的工厂:
class BarFactory
{
private $service;
public function __construct($service)
{
$this->service = $service;
}
public function createBar($userId, $date)
{
return new Bar($userId, $date, $service);
}
}
这样你仍然可以通过依赖注入容器传递服务。