2013-03-17 19 views
7

Gibt es eine Möglichkeit, die generateUrl() -Methode außerhalb von Controllern zu verwenden?generateUrl außerhalb des Controllers

Ich habe versucht, es in einer benutzerdefinierten Repository-Klasse mit $this->get('router') zu verwenden, aber es hat nicht funktioniert.

Update

ich eine vorübergehende Lösung hier gefunden habe:

http://www.phamviet.net/2012/12/09/symfony-2-inject-service-as-dependency-in-to-repository/

injiziert ich den ganzen Service-Container in mein Repository, obwohl es "nicht zu empfehlen".

Aber es funktioniert für jetzt.

update2

Injizieren Router anstelle des gesamten Container ist wahrscheinlich eine bessere Idee :)

+0

verwenden http://stackoverflow.com/questions/10057309/generate-a-link-from- A-Service –

Antwort

8

Den Container nicht in Ihr Repository injizieren ... Wirklich, nicht!

Wenn ich Sie wäre, würde ich einen Dienst erstellen und injiziert den Router darin. In diesem Dienst würde ich eine Methode erstellen, die das Repository verwendet und den benötigten Code über den Router hinzufügt.

Das ist viel weniger schmutzig und einfach zu verwenden/verstehen für einen anderen Entwickler.

+0

nur Router injizieren ist auch eine schlechte Idee? –

+1

Es ist eine bessere Idee, aber leider immer noch keine gute Idee.: < Repositories Zweck ist es, einige benutzerdefinierte Abfragen zu schreiben, keine Sachen wie Umleitung. Es ist eigentlich mehr eine Frage guter Praktiken – Gmajoulet

+0

Gmajoulet, vielleicht einige Links zu der Dokumentation würde helfen –

11

Wenn Sie einen Blick in the source code of Controller::generateUrl() nehmen, Sie sehen, wie es gemacht wird:

$this->container->get('router')->generate($route, $parameters, $referenceType); 

Im Grunde geben Sie einfach den Namen der Route ein ($route hier); falls vorhanden, einige Parameter ($parameters) und die Art der Referenz (eine der Konstanten der UrlGeneratorInterface)

+1

Aber $ this-> Container ist auch nicht in Repositories verfügbar. Wie gebe ich einen Container an sie weiter? –

+0

Sie haben den Punkt der Frage in dieser Antwort vollständig verpasst !! Die Verwendung von "this" setzt voraus, dass Sie sich innerhalb des Controllers befinden. – cartbeforehorse

+2

@cartbeforehorse Nein, dieses asumes nimmt an, dass Sie in einem Objekt instanziiert werden können ... –

Verwandte Themen