2013-05-30 1 views
0

내가 클래스 DefaultController의 독백상속 클래스에서 독백을 사용하는 방법 컨트롤러 클래스

을 사용하고는 컨트롤러에게

같은

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

내가 this-를 호출 할 수 있습니다> 수 ('로거를 확장 ')를 Controller 클래스를 상속받은 클래스에서 가져온다. 그러나 /Entity/User.php와 같은 다른 클래스의 로거를 사용하고 싶습니다. 어떻게 만들 수 있습니까?

내 기준이 있기 때문에 우려의 분리의

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

답변

10

일반적으로 컨테이너가 자동 삽입되지 않는 클래스 (예 : ContainerAwareCommand를 확장하는 컨트롤러 및 명령)에서 의존성 삽입을 사용하여 로거와 같은 서비스에 액세스 할 수 있습니다.

가능한 주입 유형은 속성, 설정자 및 생성자 주입입니다. 내 예는 constructor injection입니다. 먼저 서비스를 생성해야합니다. 예는 다음과 같이 할 수

가정 YML 구성 :이 서비스로 호출 될 경우 '로거'서비스가 자동으로 NonControllerExtendingClass에 주입 내 예에서

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

.

use Symfony\Component\HttpKernel\Log\LoggerInterface; 

// ... 

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

가 지금처럼 방법 로거를 사용하십시오 : 당신이 당신의 공급 업체에/YourBundle/NonControllerExtendingClass 같은 것을 가지고 있는지 확인하십시오 당신이 당신의 클래스를 호출하는 경우 로거는 주입됩니다

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의 경우 이 로거 인터페이스를 사용하십시오. Psr \ Log \ LoggerInterface – skonsoft

0

이다, 실체는 서비스에 대한 종속성이 안된다. 필요에 따라 컨트롤러/서비스 또는 로깅하려는 엔터티 메서드를 호출하는 로거를 사용하는 것이 좋습니다.

일반적으로 클래스를 서비스로 정의하고 해당 서비스에 로거를 삽입 할 수 있습니다. 서비스 컨테이너 및 의존성 삽입에 대해 아직 잘 알고 계시지 않으시면 this chapter 문서를 읽어 보시기 바랍니다.

파악하기 까다로운 주제 일 수 있습니다. 그러나 심포니의 중요한 구성 요소이기 때문에 이것을 이해하려고 노력하는 것이 가치가 있습니다.

관련 문제