2013-03-15 13 views
8

Przenoszę mój stary kod do frameworka Symfony 2.2.Gdzie umieścić logikę biznesową to warstwa modelu Symfony 2?

W moim starym kodzie, moja encja Artykuł posiadał metodę getUrl(), która zwróciła URL bieżącego artykułu.

W Symfony muszę korzystać z usługi routera, aby wygenerować takie adresy URL.

Nie mogę uzyskać dostępu do routera z wnętrza jednostki, ponieważ jest to zła praktyka i nie jest obsługiwana przez framework.

Mogę wywołać router z samego szablonu Twig przy użyciu pomocnika Twig ścieżka() i podać wszystkie argumenty (z instancji artykułu) potrzebne do skonstruowania adresu URL. Ale to podejście nie jest zbyt dobre, ponieważ jeśli zdecyduję się zmienić reguły formatowania adresów URL - będę musiał znaleźć wszystkie te połączenia i je przepisać (niezbyt DRY).

Naprawdę chcę zapisać tutaj enkapsulację logiki biznesowej i nie wyciągać wszystkich odwagi do warstwy widoku.

Jak powinienem postępować w tej sytuacji?

Odpowiedz

11

Utwórz klasę ArticleManager w warstwie usług i obsłuż tam dowolną logikę biznesową. Możesz przekazać router do niego poprzez wstrzyknięcie zależności.

Dla przykładu, ArticleManager miałoby getUrl(Article $article) metodę, która będzie korzystać z routera instancji (które albo wstrzykiwany przez __construct lub oddzielnego setter) do generowania adresu URL w oparciu o właściwości $article i zwrot.

Ta metoda zapewnia, że ​​logika biznesowa nie zanieczyszcza warstw widoku ani kontrolera.

Należy przeczytać na stronie Service Container docs.

+0

Dzięki Arms! Myślałem o tym podejściu, po prostu potrzebowałem potwierdzenia od kogoś bardziej doświadczonego) Nie jestem pewien, czy naprawdę dobrze sobie radzę z zarządzaniem modelami z innej klasy, ale wygląda na to, że jest to realna opcja. –

+0

Jeśli pochodzisz z ORM z Aktywnej Rekordu, to z pewnością wydaje się być obcym podejściem. Ale z biegiem czasu docenisz rozdzielenie obaw i zastanawiam się, jak sobie radziłeś wcześniej ;-) –

+0

@SlavaFominII To jest dobre rozwiązanie, ale jeśli masz ten sam obiekt "modelowy", połącz je z tym samym Mangerem, mieć menadżera (czyli usługę) dla każdego podmiotu twojej aplikacji, a to czasami nie jest godne zaufania – DonCallisto

Powiązane problemy