Symfony依赖注入构造函数运行时参数


Symfony Dependancy Injection Runtime Arguments to Constructor

我试图使用Symfony依赖注入组件,使我的PHP类更容易进行单元测试。然而,当我想要的类具有在运行时确定的构造函数参数时,我会陷入困境。类必须用参数实例化才能有意义。我不想使用setter注入。我有一种感觉,我将无法在这种情况下使用依赖注入,需要重新组织我试图这样做的方式,但我不确定我需要做什么…

我读到,如果我有运行时参数,我应该使用抽象工厂,但我的类也将有$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'));

您可以创建一个这样的工厂:

class BarFactory 
{
    private $service;
    public function __construct($service)
    {
        $this->service = $service;
    }
    public function createBar($userId, $date)
    {
        return new Bar($userId, $date, $service);
    }
}

这样,你仍然可以通过依赖注入容器传递服务。