Reputation: 28611
I'm moving my old codebase to the Symfony 2.2 framework.
In my old code, my Article entity has had a method getUrl(), which was returning a URL for current article.
In Symfony i have to use Router service to generate such an URLs.
I can't access Router from inside the Entity, cause it's a bad practice and not really supported by the framework.
I can call the router from the Twig template itself using Twig helper path() and provide all the arguments (from the Article instance) needed to construct the URL. But this approach is not very good, cause if i'll decide to change URL formatting rules - i will have to find all this calls and rewrite them (not very DRY).
I really want to save the business-logic encapsulation here and not to pull all the guts to the view layer.
How should i proceed in this situation?
Upvotes: 8
Views: 3038
Reputation: 25295
Create an ArticleManager
class in your service layer, and handle any business logic there. You can pass the router to it through dependency injection.
For your example, ArticleManager
would have a getUrl(Article $article)
method which would use the router instance (that you either injected through __construct
or a separate setter method) to generate the Url based on properties of $article
, and return it.
This method will ensure that your business logic doesn't pollute the view or controller layers.
Be sure to read up on the Service Container docs.
Upvotes: 11