2013-05-30 16 views

回答

10

一般而言,您可以通過使用依賴注入訪問類似記錄器的服務,該類中的容器不會自動注入容器(即控制器和命令擴展ContainerAwareCommand)。

可能的注入類型是屬性注入,設置注入和構造注入。我的例子將覆蓋constructor injection。您首先需要爲您的班級創建服務

假設YML配置的例子看起來是這樣的:

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

在我的例子,如果它被稱爲作爲服務「記錄器」服務會自動在NonControllerExtendingClass注入。請確保你有這樣的事情在你的供應商/ 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); 

如果你想跟蹤與記錄實體的變化,你應該使用主義事件監聽器用戶。 在文檔章節 - How to Register Event Listeners and Subscribers中瞭解更多信息。

+0

對於symfony 3, 使用此loger接口: Psr \ Log \ LoggerInterface – skonsoft

0

由於關注點分離的,實體應該不會對服務的依賴性。根據您的需要,使用控制器/服務中的記錄器或調用您想要記錄的實體方法的任何內容都可能是明智的。

一般來說,您可以將類定義爲服務並將記錄器注入該服務。如果您還不熟悉服務容器和依賴項注入,我強烈建議您閱讀文檔this chapter

這可能是一個棘手的問題。然而,由於它是symfony的一個重要組成部分,因此嘗試瞭解這一點真的值得您一試。