我可以从Symfony中的服务创建参数吗?


Can I create a parameter from a service in Symfony

我需要使用服务在服务容器中设置一个参数(一个整数),就像我可以使用服务配置中定义的另一个服务(通过定义工厂类和方法)来创建服务一样。

我能想到的唯一方法是将值包装在一个类中,并使用上面的方法将该类创建为服务,这对我来说有点尴尬。

任何想法?

编辑

澄清。我需要将一个整数值注入到许多不同的服务中。该值由服务计算。

如果它是一个对象,那么我可以将它定义为服务,并使用工厂类和定义参数创建它,然后将该服务注入需要它的其他服务中。

是否有可能为整数值做到这一点,或者我必须将其包装在一个值对象/类中才能做到这一点?

比注入服务计算结果更好的解决方案是注入服务本身:

class ProviderService {
    public function calculateResult() {
        return 42; // your integer result
    }
}
class ConsumerService {
    private $provider;
    public function __construct(ProviderService $provider) {
        $this->provider = $provider;
    }
    public function execute() {
        $result = $this->provider->calulateResult();
        // business logic
    }
}

如果整数值的计算是昂贵的,您可以将其缓存在ProviderService .

听起来很简单,值不能是服务。因此,您不能注入从服务派生的值。如果你保持你的配置不变,你需要定义一个值对象,或者你需要将"工厂"服务注入到需要计算值的服务中。

如果该值只依赖于配置,你可以添加一个编译器传递,计算一次该值,并将其设置给所有需要它的服务。在编译器传递期间,您可以更改Service构造函数的参数或添加对setter方法的调用。

如果值需要在运行时确定,那么创建一个新服务是有意义的。这是因为应该有一个服务来"检测"更改并"通知"所有依赖的服务。