2011-11-19 14 views
6

Jestem nowicjuszem w Symfony 2 i przechodzę do zaawansowanych tematów, takich jak services. Kiedy obiekt powinien być usługą?Zrozumienie usług Symfony2

Załóżmy na przykład, że masz obiekt fasady do wykonania połączenia z usługą REST. Ta klasa wymaga nazwy użytkownika i hasła. Czy poprawne byłoby modelowanie tej klasy jako usługi globalnej? Nawet jeśli jest używany tylko w części całego projektu?

# app/config/config.yml 
parameters: 
    my_proxy.username: username 
    my_proxy.password: password 

services: 
    my_proxy: 
     class:  Acme\TestBundle\MyProxy 
     arguments: [%my_proxy.username%, %my_proxy.password%] 

Odpowiedz

13

Definicja pochodzi z Symfony2 glossary:

usługa jest ogólne określenie dla każdego obiektu PHP, który wykonuje określone zadanie. Usługa jest zwykle używana "globalnie", na przykład obiekt połączenia z bazą danych lub obiekt dostarczający wiadomości e-mail. W Symfony2 usługi często są konfigurowane i pobierane z kontenera usług. Uważa się, że aplikacja, która ma wiele oddzielonych usług, działa zgodnie z architekturą zorientowaną na usługi.

Myślę, że twój przykład jest idealnym kandydatem do usługi.

Nie chcesz kopiować kodu konstrukcyjnego do wszystkich miejsc, w których potrzebujesz swojego klienta API. Lepiej przekazać to zadanie do kontenera wtrysku zależności.

W ten sposób jest łatwiej utrzymać (ponieważ konstrukcja odbywa się w jednym miejscu i można ją konfigurować).

Jest także bardziej elastyczny, ponieważ można łatwo zmienić klasę klienta API bez wpływu na kod, który z niego korzysta (o ile implementuje ten sam interfejs).

Nie sądzę, że istnieje złota zasada. Ale zasadniczo wszystkie klasy realizujące zadanie są dobrymi kandydatami do usługi. Z drugiej strony jednostki nie są takie, jakimi są najczęściej tylko posiadacze danych.

Zawsze polecam serię artykułów Fabien na temat: http://fabien.potencier.org/article/11/what-is-dependency-injection

1

Tak, ponieważ pozwoli to zaoszczędzić część konfiguracyjną. Nie będziesz pobierać nazwy użytkownika i hasła i przekazywać je do konstruktora za każdym razem, gdy potrzebujesz tej klasy.