2012-07-10 15 views

Odpowiedz

8

Postaram się jak najlepiej wyjaśnić usługi, ale Symfony2 docs wykonają lepszą pracę, niż będę w stanie.

W swojej istocie usługa jest po prostu klasą. Klasa staje się usługą, gdy jest zarejestrowana w Symfony2's Dependency Injection Container (lub po prostu Container w skrócie). W tym momencie klasa jest częścią warstwy serwisowej aplikacji.

Usługa może mieć zależności (i często to robi), ale nie jest wymagana. Usługa jest często używana jako zależność od innych usług. Podam przykład:

  • Masz klasę używany do wysyłania wiadomości e-mail, zwany EmailSender
  • masz klasy, który zawiera instrukcje dotyczące sposobu wysyłania wiadomości e-mail przez SMTP, zwany SmtpTransport
  • EmailSender ma zależność w postaci SmtpTransport. Innymi słowy, aby móc wykonać zadanie, musi ono wykonać instancję SmtpTransport. (Należy pamiętać, że chociaż EmailSender ma zależności, SmtpTransport nie.)

Powiedzieć trzeba użyć EmailSender w pięciu różnych miejscach w aplikacji. W każdym miejscu, można mieć kod jak poniżej:

$emailSender = new EmailSender(new SmtpTransport()); 
$emailSender->send($email) 

To nie jest dużo kodu (od EmailSender ma tylko jedną zależność), ale to, co się dzieje, gdy uznasz, że zamiast używać SMTP, EmailSender powinny wykorzystywać transport klasa dla sendmail? Musisz edytować każdy blok kodu, aby go zaktualizować. Możliwe jest zarejestrowanie EmailSender i jego zależności jako usług.
rejestracji wygląda następująco:

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

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

Teraz, aby go używać (z container świadomy kontekstu):

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

zauważyć, jak wiele prostsze i czystsze to faktycznie korzystać z klasy do wysyłania e-maili ? Oczywiście, musisz najpierw wykonać pracę, aby zarejestrować usługę, ale to jest trywialne i trzeba to zrobić tylko raz.

Wyobraź sobie, że EmailSender ma trzy zależności, zamiast jednej. Korzystając z usług, wystarczy zmodyfikować rejestrację usługi bez konieczności zmiany kodu implementacji (kod używany do wysyłania wiadomości e-mail).

W skrócie, warstwa usług działa jako centralne repozytorium dla klas, które a) mają jedną lub więcej zależności b) muszą być używane w zasięgu "globalnym".Pobranie tych klas usług od Dependency Injection Container kończy się mniejszym, redundantnym kodem i łatwiejszym sposobem dokonywania szerokich zmian.

Mogę się mylić, ale myślę, że Symfony2 to pierwsza platforma PHP do implementacji kontenera wtrysku zależności. W związku z tym wielu programistów PHP może nie znać koncepcji usług. Zdecydowanie sugeruję, abyś zrozumiał to w pełni, ponieważ przekonasz się, że to bardzo potężne narzędzie. Dodatkowo, pojęcie usług nie jest w żaden sposób ograniczone do Symfony2, a nawet PHP - będziesz mógł skorzystać z tej koncepcji w wielu różnych frameworkach i językach.

1

Spróbuj serii Fabien za artykułów na ten temat: Dependency Injection.

+0

Zrozumiałem DI, ale nie mogłem zrozumieć rzeczy usługi – user825904

+0

to to samo. usługa jest po prostu klasą, która została określona w DIC – MDrollette

+0

Uczę się symfony2 z tego linku http://tutorial.symblog.co.uk/docs/customising-the-view-more-withtwtw.html, Czy ktoś może mi powiedzieć, jaka jest warstwa usługi w tym lub w jaki sposób ten samouczek używa warstwy usługi – user825904

Powiązane problemy