2

PSR ロガー インターフェース標準に準拠したクラスがあり、ログを必要としない人や PSR ロガーを気にしない人でも使用できるようにしたいとします。ロガーにメソッドインジェクションを使用することは明らかです(のようなものfunction setLogger(Psr\Log\LoggerInterface $logger){...})。ロガークラスが指定されているかどうかわからない場合、ロガーのメソッドを呼び出す方法を考えています。解決策の 1 つは、ロガーのプロキシとして機能するクラスを作成することですが、それが適切な解決策かどうかはわかりません。

4

2 に答える 2

3

「NullLogger」を実装して、デフォルトのロガーとして使用できます。

class NullLogger implement LoggerInterface
{
    public function error($message, $context = [])
    {
        // do nothing
    }
    // ...
}

class MyClass
{
    private $logger;

    public function __construct(LoggerInterface $logger = null)
    {
        $this->logger = $logger ?: new NullLogger();
    }

    public function doSomething()
    {
        $this->logger->info('');
        // ...
    }

    public function setLogger(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
}

また、古き良きものを真剣に検討します。

if ($this->logger) {
    $this->logger->...
}

(どこでも使用されていない場合)軽量であるため。

しかし、最初の解決策は間違いなく有効な IMO です。

最後に、ロギングはクラスと直接関係がなく、それはユーザーの責任に任せることができる動作であると判断することもできます。イベントまたはテンプレート メソッド パターンを使用して拡張ポイントを提供できます (興味がある場合は、それに関する私の質問を参照してください:オープン ソース ライブラリにイベントまたは「テンプレート メソッド」パターンを使用する必要がありますか? )。

要約すると、それはユースケースに依存すると思います。多くのログを記録しますか? 「ロギング」は提供する機能の一部ですか? それとも明らかに別の懸念ですか?

于 2013-09-19T21:17:57.643 に答える
1

結局のところ、PSR 標準では、この目的に使用できる null ロガーが定義されています。

<?php
use \PSR\Log\NullLogger
于 2013-12-05T14:59:16.717 に答える