我使用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如果方法不存在,就忽略这个调用?
你这是在重新发明轮子。
Symfony已经提供了这个功能。
如果一个服务实现了 LoggerAwareInterface
(联系),Symfony会自动调用 setLogger()
上的服务来注入记录仪服务。
由于同一软件包还包括一个 LoggerAwareTrait
, (联系)你可以简单地做以下工作。
class FooService implements LoggerAwareInterface
{
use LoggerAwareTrait;
}
这就是它。如果你使用的是默认的autowireautoconfigure设置。,不需要其他配置,记录器会自动注入。
您可以实现上述功能,将您的 calls: setLogger
从 services.yaml
而记录器会被注入到你想要的类中,不会注入到你不想要的类中。