2009-09-21 6 views
3

En ce qui concerne les meilleures pratiques, est-ce recommandé? J'ai un contrôleur + modèle de commentaires qui doit être appelé dans un contrôleur d'éléments et de profils. Le contrôleur de commentaires charge automatiquement le modèle de commentaires.Appel d'un contrôleur dans un contrôleur?

Est-il acceptable d'appeler le contrôleur de commentaires directement à partir des éléments et du contrôleur de profil, ou est-ce la meilleure façon d'appeler le modèle de commentaires à la place?

Je demande parce que dans kohana, la vue n'est pas une classe singleton donc si je devais appeler un contrôleur dans un autre contrôleur, je me retrouve avec deux vues. D'un autre côté, si je devais simplement appeler le modèle, il y aurait du code dupliqué dans le contrôleur d'items et de profils.

Tous les experts MVC vous aident! =)

Répondre

3

En général, j'irais pour l'approche "Fat Model".

Je ne suis pas sûr du code que vous êtes vraiment inquiet à propos de la duplication.

Il y a deux manières, vous pouvez le faire:

Première façon: - Interrogez votre modèle Commentaires pour revenir quelques commentaires. - Transmettez les données de commentaire dans votre vue. - Rendu des commentaires dans la vue, éventuellement en utilisant un assistant d'affichage

Deuxième moyen: - Sachez que votre vue ne peut pas communiquer directement avec votre modèle. - Ecrivez un assistant d'affichage qui saisit directement les données dont il a besoin à partir du modèle et le restitue.

Je préfère la deuxième façon. Certaines personnes ont un problème à laisser leur couche de vue parler au modèle (en lecture seule!), Mais je n'en fais pas partie.

+0

Donc, à votre avis, recommanderiez-vous de contourner le contrôleur de commentaire et de charger le contrôleur de l'élément/du profil dans le modèle de commentaire? – jusunlee

+0

Oui, exactement. Pourquoi impliqueriez-vous le contrôleur de commentaires? Il suffit que le contrôleur de profil utilise les modèles dont il a besoin. Les contrôleurs sont là pour gérer l'interaction de l'utilisateur d'une manière saine. Ils ne sont pas la police de données, si vous voyez ce que je veux dire. – timdev

1

Je dirais que cela dépend de ce que votre contrôleur retourne.

Si votre contrôleur peut renvoyer des DTO/modèles, alors, appelez un contrôleur est une bonne idée.

Votre contrôleur définit des points d'entrée stricts, documentés et, espérons-le, stables pour votre fonctionnalité. Par conséquent, vous pouvez complètement ignorer l'implémentation des commentaires, ou les modifier à volonté, tant que vous ne modifiez pas la signature de la méthode Controller. Cependant, si votre contrôleur est incapable de renvoyer des données brutes, alors il est définitivement prolifique, parce que vous obtenez le html (ou un autre balisage) en retour. Cela signifie que vous devrez diriger ce code HTML directement dans la vue que vous voulez, ou en extraire les données. Les deux sont une mauvaise idée. Si vous modifiez la vue pour Commentaires, l'affichage des commentaires sur le module Profil changera inévitablement. Cela pourrait être ce que vous voulez, mais j'irais vers la flexibilité. Maintenant, si vous vouliez des données, vous devez extraire les données du balisage que vous avez renvoyé, ce qui est lourd et contre-productif.

+0

c'est le problème exact que j'ai, le contrôleur retourne des données brutes. Que recommanderiez-vous en fonction de ce fait? – jusunlee

6

Si vous utilisez Kohana 3, vous pouvez bénéficier de la fonctionnalité HMVC. Vous pouvez exécuter des contrôleurs dans les contrôleurs.

http://forum.kohanaphp.com/comments.php?DiscussionID=2768

Vérifiez le lien ci-dessus pour quelques exemples

+1

Ils ont juste refait leur forum car j'utilisais cette référence de lien ... m'a été très utile ... http://forum.kohanaframework.org/discussion/2768/ – Serhiy

0

Si vous essayez d'appeler une méthode statique, vous pouvez simplement appeler directement la fonction. Par exemple:

class Controller_User extends Controller { 
    public static function format_user($user){ 
     return array("data" => $user->getData()); 
    } 
} 

class Controller_Foo extends Controller { 
    public function action_index(){ 
     $user = get_user_data_some_how(); 
     $user_data = Controller_User::format_user($user) 
    } 
} 
Questions connexes