2013-03-15 17 views
8

Sto spostando la mia vecchia base di codice nel framework Symfony 2.2.Dove posizionare la logica aziendale è il livello di modello di Symfony 2?

Nel mio vecchio codice, la mia entità articolo ha avuto un metodo getUrl(), che restituiva un URL per l'articolo corrente.

In Symfony devo utilizzare il servizio Router per generare tali URL.

Non riesco ad accedere al router dall'entità, perché è una cattiva pratica e non è realmente supportata dal framework.

Posso chiamare il router dal modello Twig stesso utilizzando Twig helper path() e fornire tutti gli argomenti (dall'istanza Article) necessari per costruire l'URL. Ma questo approccio non è molto buono, perché se deciderò di cambiare le regole di formattazione degli URL - dovrò trovare tutte queste chiamate e riscriverle (non molto DRY).

Voglio davvero salvare l'incapsulamento della logica di business qui e non tirare tutte le viscere al livello vista.

Come devo procedere in questa situazione?

risposta

11

Creare una classe ArticleManager nel livello di servizio e gestire qualsiasi logica di business. È possibile passare il router ad esso tramite l'iniezione di dipendenza.

Per esempio, ArticleManager avrebbe un metodo getUrl(Article $article) che utilizzare l'istanza del router (che si sia iniettato attraverso __construct o un metodo setter separato) per generare l'URL in base alle proprietà di $article, e restituirlo.

Questo metodo garantisce che la logica aziendale non inquini i livelli della vista o del controller.

Assicurarsi di leggere su Service Container docs.

+0

Grazie Arms! Stavo pensando a questo approccio, avevo solo bisogno di una conferma da parte di qualcuno più esperto) Non sono sicuro di essere davvero a mio agio nel gestire le entità modello da qualche altra classe, ma sembra che questa sia solo un'opzione praticabile. –

+0

Se provieni da un ORM attivo, questo sembra decisamente un approccio estraneo. Ma col tempo apprezzerai la separazione delle preoccupazioni e ti meraviglierai di come sei mai stato prima ;-) –

+0

@SlavaFominII Questa è una buona soluzione, ma se hai lo stesso oggetto "modello", raggruppali nello stesso presepe o avere un manager (quindi un servizio) per ogni entità della tua applicazione e questo, a volte, non è opportuno – DonCallisto

Problemi correlati