Hvordan kan jeg få tilgang til en tjeneste utenfor en kontroller med Symfony2?

stemmer
51

Jeg bygger et nettsted som er avhengig ganske tungt på en tredjeparts API, så jeg tenkte at det ville være fornuftig å pakke opp API wrapper som en tjeneste, men jeg begynner å finne tilfeller hvor det ville være nyttig å ha tilgang til det utsiden av en styreenhet, slik som i en enhet depotet. Også relatert til det er at det ville være nyttig å være i stand til å få adgang til konfig verdier utsiden av en styreenhet (igjen, slik som i en enhet depot).

Kan noen fortelle meg om dette er mulig, og hvis ikke er det en foreslått tilnærming til å gjøre denne typen ting?

takk for hjelp

Publisert på 25/05/2011 klokken 12:29
kilden bruker
På andre språk...                            


2 svar

stemmer
74

Den Symfony distribusjon avhenger svært mye av avhengighet injeksjon. Det vil si at vanligvis er avhengig injiseres direkte inn i objektet via konstruktøren, de settere eller via andre midler (som refleksjon om egenskaper). API wrapper tjenesten er da en avhengighet til andre objekter av søknaden din.

Når det er sagt, ville det være ganske vanskelig å injisere denne tjenesten i en enhet depot konstruktør fordi det allerede krever noen andre parametere, og jeg tror det ville ikke være mulig å injisere dem på grunn av måten vi ber depotet for en enhet.

Det du kan gjøre er å opprette en tjeneste som vil være ansvarlig for å gjøre arbeidet du var i ferd med å gjøre i foretaket depotet. På denne måten vil du være i stand til å injisere foretaket manager, som vil bli brukt til å hente foretaket depotet, du tilpasset service og også en annen tjeneste som holder dine konfigurasjonsverdier (det finnes andre måter å dele konfigurasjonsverdier).

I min bruk tilfelle, jeg bruker en Facebook hjelpetjeneste som brytes Facebook API-kall. Denne tjenesten er deretter injisert der jeg trenger det. Min enhet repository er bare ansvarlig for å gjøre databasekall så det får bare de argumenter den trenger og ikke hele avhengighet. Dermed vil det ikke få hjelperen men heller bare de argumentene som trengs for å gjøre en forespørsel, for eksempel en Facebook-bruker-ID. Etter min mening, er dette måten å gjøre det siden jeg tror foretaket depot bør ikke ha avhengigheter på slike hjelpeobjekter.

Her et lite eksempel med YAML som konfigurasjon:

# app/config/config.yml
services:
  yourapp.configuration_container:
    class: Application/AcmeBundle/Common/ConfigurationContainer
    # You could inject configurations here      

  yourapp.api_wrapper:
    class: Application/AcmeBundle/Service/ApiWrapperService
    # Inject other arguments if needed and update constructor in consequence    

  yourapp.data_access:
    class: Application/AcmeBundle/Data/Access/DatabaseAccessService
    arguments: 
      entityManager: "@doctrine.orm.entity_manager"
      apiWrapperService: "@yourapp.api_wrapper"
      configuration: "@yourapp.configuration_container"

# Application/AcmeBundle/Common/ConfigurationContainer.php
public ConfigurationContainer
{
   public function __construct()
   {
       // Initialize your configuration values or inject them in the constructor
   }
}        

# Application/AcmeBundle/Service/ApiWrapperService.php
public ApiWrapperService
{
   public function __construct()
   {
       // Do some stuff
   }
}

# Application/AcmeBundle/Data/Access/DatabaseAccessService.php
public DatabaseAccessService
{
    public function __construct(EntityManager $entityManager, ApiWrapperService $apiWrapperService, ConfigurationContainer $configuration)
    {
        ...
    }
}

-Tegnet (@) i den config.yml fil betyr at Symfony skal injisere en annen tjeneste, har den id definert etter at skiltet, og ikke en enkel streng. For konfigurasjonsverdiene, som sagt tidligere, er det andre måter å oppnå det samme mål som ved hjelp av parametre eller en bunt forlengelse. Med en bunt forlengelse, kan du definere konfigurasjonsverdiene direkte inn i config.yml og bundle ville lese dem.

I konklusjonen, bør dette gi deg den generelle ideen om å injisere tjenester. Her en liten liste over dokumentasjon om emnet. Mye av linkene bruke XML tjenesten definisjon i stedet for YAML definisjonen, men du bør være i stand til å forstå dem ganske enkelt.

  1. Symfony Offisiell DI
  2. Fabien Potencier varer på DI
  3. Richard Miller varer på DI (Sjekk i bloggen sin for de andre DI artikler)

Ta oppmerksom på at konfigurasjonen jeg gir jobber for Beta1 av Symfony2. Jeg visste ikke oppdatere ennå Beta2 så det kan være noen ting ikke fungerer som de er i Beta2-versjonen.

Jeg håper dette vil hjelpe deg å definere en endelig løsning på problemet. Ikke nøl med å spørre andre spørsmål om du vil avklaringer eller noe annet.

Hilsen, Matt

Svarte 25/05/2011 kl. 16:26
kilden bruker

stemmer
0

Jeg ville bryte denne type atferd i en Symfony tjeneste (som en manager). Jeg vil ikke injisere noen parametere eller logikk til enhetens lagre så bør de hovedsakelig brukes til å hente data ved hjelp av Objektmanager spørringer. Jeg ville sette logikken i tjenestene og hvis tjenesten krever en databasetilgang vil kalle foretaket depotet for å hente data.

Svarte 23/12/2013 kl. 21:31
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more