2016-06-17 18 views
5

Mam klasy, która jest zależna od połączenia DB, coś takiego:Przechodząc fabrykę do symfony 2 Usługa

class Test 
{ 
    private $conn; 
    public function __construct(Connection $conn) { 
     $this->conn = $conn; 
    } 
} 

Usługa dla mogłoby to wyglądać tak:

services: 
     service.test: 
      class: Test 
      arguments: 
      - ["@database_connection"] 

teraz , Chciałbym przekazać własną usługę/obiekt połączenia, który przy uruchomieniu tworzy Connection. Ale nie mogę przekazać go jako argumentu, ponieważ chce obiektu Connection, a nie fabryki.

Jak mogę najlepiej to podejść?

Próbowałem dodać setConnection na klasie Test, ale byłoby ładniej zachować bieżącą definicję i usługę nienaruszone.

+0

Czy możesz zmienić swoją klasę, aby zaakceptować fabrykę jako zależność? –

+0

Mogę, ale jestem bardziej zainteresowany rozwiązaniami, które opuszczają klasę, jak to jest ... po prostu ciekawa – Oli

+0

Rozumiem. Myślę, że może być jakiś sposób. Czy mógłbyś dodać kod fabryczny i jego rejestrację w yaml? –

Odpowiedz

6

Jest to rzeczywiście gotowe rozwiązanie w Symfony Service Container.

Twoja usługa database_connection powinna być skonfigurowana do używania fabryki do tworzenia jej instancji. To byłoby coś takiego:

services: 
    database_connection: 
     class: Connection 
     factory: [ConnectionFactory, createConnection] 

A jeśli zakład jest obsługa też, może to wyglądać tak:

services: 
    database_connection: 
     class: Connection 
     factory: ["@connection_factory", createConnection] 

Więcej informacji na ten temat można znaleźć here.

+0

Działa doskonale, dzięki – Oli