1

私はモノログを使用しています

クラス DefaultController で Controller を拡張する

そのような

    $logger = $this->get('logger');
    $logger->info('Get Started');

Controller クラスを継承するクラスから this->get('logger') を呼び出すことができます。しかし、 /Entity/User.php などの他のクラスからロガーを使用したいのですが、どうすれば作れますか?

私の参照は

http://symfony.com/doc/2.0/cookbook/logging/monolog.html

4

2 に答える 2

11

一般に、コンテナが自動的に注入されないクラス (つまり、ContainerAwareCommand を拡張するコントローラーとコマンド) では、依存性注入を使用して、ロガーなどのサービスにアクセスできます。

可能な注入タイプは、プロパティ注入、セッター注入、およびコンストラクター注入です。私の例では、コンストラクターの注入について説明します。まず、クラスのサービスを作成する必要があります。

yml-configuration を想定すると、例は次のようになります。

services:
    your_service:
        class:     Vendor/YourBundle/NonControllerExtendingClass
        arguments: ["@logger"]    # inject logger service into constructor

私の例では、「ロガー」サービスは、サービスとして呼び出された場合、NonControllerExtendingClass に自動的に挿入されます。Vendor/YourBundle/NonControllerExtendingClass に次のようなものがあることを確認してください。

use Symfony\Component\HttpKernel\Log\LoggerInterface;

// ...

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

次のようにメソッドでロガーを使用します。

public function someAction()
{
    $this->logger->info('Im here');
}

クラスをサービスとして呼び出すか、ロガーを手動で注入する場合にのみ、ロガーが注入されます。

// ... gets service from the container
$my_service = $this-container->get('your_service'); 

// ... manual injection
$logger = $this->container->get('logger'); 
// alternatively create a logger object yourself i.e. $logger = new Logger();

$my_service = new Vendor/YourBundle/NonControllerExtendingClass($logger); 

ロガーでエンティティの変更を追跡したい場合は、Doctrine Event ListenerまたはSubscriberを使用する必要があります。詳細については、ドキュメントの章 - How to Register Event Listeners and Subscribers を参照してください。

于 2013-05-30T11:52:45.013 に答える
0

関心が分離されているため、エンティティはサービスに依存するべきではありません。必要に応じて、コントローラー/サービスからロガーを使用するか、ログに記録するエンティティ メソッドを呼び出すものを使用するのが賢明な場合があります。

一般的に言えば、クラスをサービスとして定義し、ロガーをそのサービスに挿入できます。サービス コンテナーと依存関係の挿入にまだ慣れていない場合は、ドキュメントのこの章を読むことを強くお勧めします。

捉えにくいテーマかもしれません。しかし、これは symfony の非常に重要なコンポーネントであるため、これを理解しようとすることは本当に価値のあることです。

于 2013-05-30T10:54:40.647 に答える