忽略setter注入中缺失的方法

问题描述 投票:1回答:1

我使用PHP traits作为mixins来注入可选的服务,即:"我的服务"。

trait Logger
{
    private LoggerInterface $logger;

    public function getLogger(): LoggerInterface
    {
        return $this->logger;
    }

    /**
     * Inject logger instance (called by the DI container)
     */
    public function setLogger(LoggerInterface $logger): self
    {
        $this->logger = $logger;

        return $this;
    }
}

然后我在一个类中使用这个trait。

class UserService
{
    use Logger;
    /* ... */
}

因为这个trait可以在任何类中使用,所以我为所有的类创建了一个方法注入调用。App\ 命名空间来注入记录器。

App\:
    # ...
    calls:
        - [setLogger, ['@monolog.logger']]

然而,当Symfony遇到一个没有实现 setLogger 方法,它抛出一个错误说 "无效服务:方法 "setLogger() "不存在"。

因为这个注入应该是可选的,有没有办法告诉Symfony如果方法不存在,就忽略这个调用?

php symfony dependency-injection symfony4
1个回答
2
投票

你这是在重新发明轮子。

Symfony已经提供了这个功能。

如果一个服务实现了 LoggerAwareInterface (联系),Symfony会自动调用 setLogger() 上的服务来注入记录仪服务。

由于同一软件包还包括一个 LoggerAwareTrait, (联系)你可以简单地做以下工作。

class FooService implements LoggerAwareInterface
{
    use LoggerAwareTrait;
}

这就是它。如果你使用的是默认的autowireautoconfigure设置。,不需要其他配置,记录器会自动注入。

您可以实现上述功能,将您的 calls: setLoggerservices.yaml而记录器会被注入到你想要的类中,不会注入到你不想要的类中。

© www.soinside.com 2019 - 2024. All rights reserved.