一般に、コンテナが自動的に注入されないクラス (つまり、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 を参照してください。