我想知道如何在以下用例下避免二传手注射。
我有一系列标记服务:
interface EmailFormatter
class CvEmailFormatter implements EmailFormatter
class RegistrationEmailFormatter implements EmailFormatter
class LostPasswordEmailFormatter implements EmailFormatter
我使用CompilerPass通过调用 addEmailFormatter()方法将这些注入到邮件服务中。
每个EmailFormatter实例都需要一些必须在运行时从当前用户检索的配置:
/**
* @var FormatterConfig[]
* @ORM\OneToMany(targetEntity="AppBundle\Entity\FormatterConfig", mappedBy="user", cascade={"persist"}, orphanRemoval=true)
*/
protected $formatterConfigs;
现在我正在检查用户是否在邮件服务的 addEmailFormatter()方法中为特定的EmailFormatter创建了配置。如果有,那么 setConfig()会注入配置对象。如果不存在配置,则根本不会添加EmailFormatter。
public function addEmailFormatter(EmailFormatter $formatter, $alias)
{
$formatterConfig = $this->user->getFormatterConfig($alias);
if (null !== $formatterConfig) {
$this->formatters[$alias] = $formatter;
$formatter->setConfig($formatterConfig);
}
}
鉴于我正在使用可变的服务集合,这可能是一个合法的用例吗?