如何从Symfony控制台应用程序中的类登录


How to log from classes in a Symfony Console application

在阅读文档和示例时,我发现LoggerInterface通过依赖项的构造函数传递,如图所示,这允许依赖项输出到控制台。

我的问题是:

  1. 如果我有多个类,我会在构造函数中不断传递LoggerInterface吗?或者有更好的实践吗?或者我应该不把它传给这些班级吗?

  2. 如果我想让一个类在没有LoggerInterface的情况下工作,我会一直检查$this->logger是否为空,然后采取相应的行动吗?

例如,

class ObjectOne {
    /**
     * @var LoggerInterface
     */
    private $logger;
    public function __construct (LoggerInterface $logger) {
        $this->logger = $logger;
    }
}
class ObjectTwo {
    /**
     * @var ObjectOne[]
     */
    private $items;
    /**
     * @var LoggerInterface
     */
    private $logger;
    public function __construct (LoggerInterface $logger) {
        $this->logger = $logger;
    }
    public function addObject () {
        $this->items[] = new ObjectOne($this->logger);
    }
}

在这种情况下,LoggerInterface的使用只不过是一个类型提示。

如果你传递了一个类的实例(或其他任何东西),但它没有实现这个接口,例如:

$objectOne = new ObjectOne('randomstring');

将抛出一个错误,指出ObjectOne的第一个参数必须是给定字符串的LoggerInterface的实例。

您可以完全删除此类型提示,但随后可以使用任何类型的第一个参数实例化您的类
因此,删除此检查可能会产生意外错误,例如,如果第一个参数不是实现LoggerInterface的类的实例,并且您试图调用该参数所属的类未实现的方法。

此外,接口允许强制类实现与接口实现的方法相同的方法,这是类之间的一种契约
因此,您可以有几个不同的类来实现同一个接口,从而尊重类构造函数的第一个参数的类型提示。