Uczę się używać symfony2, ale mam trudny czas, aby dowiedzieć się, co to jest warstwa usługi i gdzie można go używać.Jak mogę lepiej zrozumieć warstwę usługi w symfony2 w php
Jak można lepiej zrozumieć, o warstwie usług w Symfony2
Uczę się używać symfony2, ale mam trudny czas, aby dowiedzieć się, co to jest warstwa usługi i gdzie można go używać.Jak mogę lepiej zrozumieć warstwę usługi w symfony2 w php
Jak można lepiej zrozumieć, o warstwie usług w Symfony2
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:
EmailSender
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.
Spróbuj serii Fabien za artykułów na ten temat: Dependency Injection.
Zrozumiałem DI, ale nie mogłem zrozumieć rzeczy usługi – user825904
to to samo. usługa jest po prostu klasą, która została określona w DIC – MDrollette
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