2013-03-15 7 views
8

Je déplace mon ancienne base de code vers le framework Symfony 2.2.Où placer la logique métier est la couche modèle Symfony 2?

Dans mon ancien code, mon entité article avait une méthode getUrl(), qui renvoyait une URL pour l'article en cours.

Dans Symfony, je dois utiliser le service Router pour générer de telles URL.

Je ne peux pas accéder au routeur depuis l'intérieur de l'entité, car c'est une mauvaise pratique et pas vraiment supportée par le framework.

Je peux appeler le routeur à partir du modèle Twig lui-même à l'aide de Twig helper chemin() et fournir tous les arguments (de l'instance article) nécessaires pour construire l'URL. Mais cette approche n'est pas très bonne, parce que si je vais décider de changer les règles de formatage d'URL - je vais devoir trouver tous ces appels et les réécrire (pas très DRY). Je veux vraiment sauver l'encapsulation de logique métier ici et ne pas tirer tout le courage à la couche de vue.

Comment dois-je procéder dans cette situation?

Répondre

11

Créez une classe ArticleManager dans votre couche de service et gérez-y toute la logique métier. Vous pouvez lui passer le routeur via l'injection de dépendance.

Pour votre exemple, ArticleManager aurait une méthode getUrl(Article $article) qui utiliserait l'instance routeur (que vous soit injecté par __construct ou une méthode setter séparée) pour générer l'URL en fonction des propriétés de $article, et le retourner.

Cette méthode garantit que votre logique métier ne pollue pas les couches de vue ou de contrôleur. Assurez-vous de lire le Service Container docs.

+0

Merci bras! Je pensais à cette approche, j'avais juste besoin d'une confirmation de quelqu'un de plus expérimenté) Je ne suis pas sûr que je sois vraiment à l'aise avec la gestion des entités de modèle d'une autre classe, mais il semble que ce n'est qu'une option viable. –

+0

Si vous venez d'un ORM Active Record, cela ressemble vraiment à une approche étrangère. Mais au fil du temps, vous apprécierez la séparation des préoccupations et vous vous demanderez comment vous avez déjà réussi ;-) –

+0

@SlavaFominII C'est une bonne solution mais, si vous avez le même objet "modèle", placez-les dans le même Manger ou vous aurez avoir un gestionnaire (donc, un service) pour chaque entité de votre application et ce, parfois, n'est pas souhaitable – DonCallisto

Questions connexes