Ich verlagere meine alte Codebase auf das Symfony 2.2-Framework.
In meinem alten Code hatte meine Artikel-Entität eine Methode getUrl () , die eine URL für den aktuellen Artikel zurückgab.
In Symfony muss ich Router Service verwenden, um solche URLs zu generieren.
Ich kann von der Entity aus nicht auf den Router zugreifen, weil es eine schlechte Übung ist und nicht wirklich vom Framework unterstützt wird.
Ich kann den Router von der Twig-Vorlage selbst aufrufen, indem ich Twig-Helper Pfad () verwende und alle Argumente (aus der Article-Instanz) zur Verfügung stelle, die zum Aufbau der URL benötigt werden. Aber dieser Ansatz ist nicht sehr gut, denn wenn ich mich entscheide, die URL-Formatierungsregeln zu ändern, muss ich all diese Aufrufe finden und sie neu schreiben (nicht sehr DRY ).
Ich möchte hier wirklich die Business-Logik-Kapselung speichern und nicht alle Eingeweide auf die Ansichtsebene ziehen.
Wie soll ich in dieser Situation vorgehen?
Erstellen Sie eine ArticleManager
-Klasse in Ihrer Service-Schicht und behandeln Sie dort jede Geschäftslogik. Sie können den Router durch Dependency Injection an ihn übergeben.
Für Ihr Beispiel würde ArticleManager
eine Methode getUrl(Article $article)
haben, die die Router-Instanz verwendet (die Sie entweder durch __construct
oder eine separate Setter-Methode injiziert haben), um die URL basierend auf den Eigenschaften von $article
zu generieren. und gib es zurück.
Diese Methode stellt sicher, dass Ihre Geschäftslogik die Ansichts- oder Controller-Schichten nicht verschmutzt.
Lesen Sie in den Servicecontainer-Dokumenten nach.
Tags und Links symfony model symfony-2.2