2011-11-19 18 views
6

Sono abbastanza nuovo per Symfony 2 e mi sto spostando su argomenti avanzati come services. Quando dovrebbe essere un servizio un oggetto?Informazioni sui servizi Symfony2

Ad esempio, si supponga di disporre di un oggetto facciata per effettuare una chiamata a un servizio REST. Questa classe richiede un nome utente e una password. Sarebbe corretto modellare quella classe come servizio globale? Anche se è usato solo in una parte dell'intero progetto?

# 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%] 

risposta

13

Definizione tratta dal Symfony2 glossary:

Un servizio è un termine generico per qualsiasi oggetto PHP che esegue un compito specifico. Un servizio viene solitamente utilizzato "globalmente", ad esempio un oggetto di connessione al database o un oggetto che recapita messaggi di posta elettronica. In Symfony2, i servizi vengono spesso configurati e recuperati dal contenitore dei servizi. Si dice che un'applicazione che ha molti servizi disaccoppiati segua un'architettura orientata ai servizi.

Penso che il tuo esempio sia un candidato perfetto per un servizio.

Non si desidera copiare il codice di costruzione in tutti i punti in cui è necessario il client API. È preferibile delegare questa attività al contenitore di iniezione delle dipendenze.

In questo modo è più semplice da mantenere (poiché la costruzione avviene in un punto ed è configurabile).

È anche più flessibile in quanto è possibile modificare facilmente la classe del client API senza influire sul codice che lo utilizza (purché implementa la stessa interfaccia).

Non penso che ci sia una regola d'oro. Ma fondamentalmente tutte le classi che implementano un'attività sono buoni candidati per un servizio. Le entità d'altra parte non sono come sono più spesso solo titolari di dati.

Raccomando sempre la serie di articoli di Fabien sull'argomento: http://fabien.potencier.org/article/11/what-is-dependency-injection

1

Sì, perché questo ti risparmierà la parte di configurazione. Non hai intenzione di recuperare il nome utente e la password e darlo al costruttore ogni volta che ti serve questa classe.