2012-07-10 1 views

답변

8

서비스를 설명하기 위해 최선을 다할 것입니다. 그러나 Symfony2 docs은 내가 할 수있는 것보다 더 잘합니다.

핵심은 서비스는 단순히 클래스입니다. Symfony2의 Dependency Injection Container (또는 간단히 Container)으로 등록하면 클래스가 서비스가됩니다.이 시점에서 클래스는 응용 프로그램의 서비스 계층의 일부입니다.

서비스는 종속성이 있거나 (종종 그렇지만) 필요할 수 있지만 필수는 아닙니다. 서비스는 종종 다른 서비스에 대한 종속성으로 사용됩니다. 당신은 이메일을 보내는 데 사용되는 클래스가

  • EmailSender 당신은 SMTP를 통해 메일을 보내는 방법에 대한 지침을 포함하는 클래스, SmtpTransport
  • EmailSender이있다 불렀다라고 : 내가 당신에게 예를 들게 종속성은 SmtpTransport의 형식입니다. 즉, EmailSender이 작업을 수행하려면 SmtpTransport의 인스턴스가 주입되어야합니다. (EmailSender이 의존성을 가지고 있지만, SmtpTransport하지 않습니다.)

은 앱에서 다섯 개 가지 다른 장소에서 EmailSender를 사용할 필요 말. 각각의 자리에서이 같은 코드가있을 수 있습니다 :

( EmailSender 단 하나 개의 종속 관계를 가지고 있기 때문에)하지만, 대신 SMTP를 사용하는 EmailSender이 전송을 사용하도록 결정할 때 어떤 일이 많은 코드가 아니다
$emailSender = new EmailSender(new SmtpTransport()); 
$emailSender->send($email) 

sendmail의 클래스? 코드를 업데이트하려면 각 코드 블록을 수정해야합니다.

EmailSender 및 그 종속성을 서비스로 등록하는 방법도 있습니다.
등록은 다음과 같습니다

// YourApp/YourBundle/Resources/config/services.yml 
services: 
    smtp_transport: 
    class: YourApp\YourBundle\Email\SmtpTransport 

    email_sender: 
    class: YourApp\YourBundle\Email\EmailSender 
    arguments: 
     - @smtp_transport 

을 지금의 (a container 인식 맥락에서)이 기능을 사용하려면

$container->get('email_sender')->send($email); 

공지 사항을 얼마나 간단하고 실제로 이메일을 보낼 수있는 클래스를 사용하는 청소기 ? 물론 서비스를 등록하기 위해 먼저 작업을 수행해야하지만, 이는 사소한 일이며 한 번만 수행하면됩니다.

EmailSender에는 하나가 아닌 3 개의 종속성이 있다고 가정 해보십시오. 서비스를 사용하면 구현 코드 (전자 메일을 보내는 데 사용 된 코드)를 변경하지 않고도 서비스 등록을 수정하면됩니다.

즉, 서비스 계층은 a) 하나 이상의 종속성 b)을 '글로벌'범위로 사용해야하는 클래스의 중앙 저장소 역할을합니다.Dependency Injection Container에서 이러한 서비스 클래스를 가져 오면 중복 코드가 줄어들고 광범위한 변경을 수행하는 더 쉬운 방법이됩니다.

내가 틀릴 수도 있지만 Symfony2가 의존성 주입 컨테이너를 구현 한 첫 번째 PHP 프레임 워크라고 생각합니다. 따라서 많은 PHP 개발자가 서비스 개념에 익숙하지 않을 수 있습니다. 매우 강력한 도구라는 것을 알게 될 것입니다. 또한 서비스의 개념은 Symfony2 또는 PHP에 국한되지 않습니다. 다양한 프레임 워크와 언어에서이 개념을 활용할 수 있습니다.

1

주제에 기사의 파비앙의 일련의 시도 : Dependency Injection을.

+0

DI를 이해했지만 서비스 물건을 이해할 수 없었습니다 – user825904

+0

똑같습니다. 서비스는 DIC에 명시된 클래스입니다 – MDrollette

+0

이 링크에서 symfony2를 학습했습니다 http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html, 누구든지이 서비스 계층이 무엇인지 또는이 튜토리얼에서 서비스 계층을 사용하는 방법을 말해 줄 수 있습니까? – user825904

관련 문제