2010-05-19 7 views
4

si j'ai une page sur mon site où je dois afficher 4 ou 5 extraits (flux d'actualités, flux d'événements, etc.), tous liés à des données différentes (dans différents modèles et tables db), puis Quelle est la meilleure façon de gérer la génération du contenu et de la disposition des extraits? Je pourrais utiliser un seul contrôleur de snippet qui contient des fonctions statiques qui retournent chacune une vue remplie avec les données pertinentes. Mais chaque fonction de ce contrôleur d'extraits va interagir avec différentes données/modèles, donc je ne suis pas sûr de savoir comment cela est. Ou, je pourrais juste ajouter une fonction statique à chacun des contrôleurs qui traitent chaque ensemble de données associé - par exemple dans un contrôleur de News, ainsi que des fonctions pour montrer tous les articles de nouvelles, articles de nouvelles individuels etc., je pourrais ajouter une fonction statique pour générer le fil de nouvelles en renvoyant simplement la vue dont j'ai besoin. Je pense que cette approche pourrait fonctionner, car je ne veux pas instancier un objet pour ces fragments simples, donc avoir des fonctions statiques dans les contrôleurs pertinents a un peu de sens. Un peu de courant de conscience ici, mais ai-je un sens?Gestion des extraits et des vues dans MVC

+0

+1: Bonne question et je pense que vous devriez l'adopter comme une approche par page, c'est-à-dire mettre un contrôleur sur chaque page, quelle qu'elle soit. – Sarfraz

Répondre

2

De nombreux frameworks ont une certaine notion de "partiels", qui sont typiquement utilisés pour ce genre de chose. Comme ces partiels sont généralement en lecture seule et sont souvent affichés sur chaque page (ou sur un ensemble de pages bien défini), vous pouvez les approcher sans penser à des contrôleurs comme vous le feriez pour une page. En d'autres termes - rappelez-vous que c'est bien si votre vue/code de mise en page parle directement à vos modèles, à condition de les interroger uniquement.

Je fais des choses comme ça tout le temps:

layout.php:

<div id="newsWidget"> 
<?PHP $news = Model_News::latest(); ?> 
<?PHP foreach($news as $newsitem): ?> 
<!-- output some news headlines --> 
<?PHP endforeach; ?> 
</div> 

Model_News :: dernière() pourrait mettre en œuvre une mise en cache, etc, car ce code est de mise en page et je ne doute Je ne veux pas frapper le db à chaque demande.

Aucun contrôleur n'est nécessaire!

+0

cadres diffèrent dans l'efficacité des partiels. J'ai utilisé une approche similaire à celle recommandée par timdev avec la mise en cache parce que mes partiels sont apparus sur chaque page d'un site occupé. Je trouve difficile d'équilibrer la «justesse» d'une solution avec les aspects pratiques de l'exécution rapide du travail et de l'obtention d'un résultat.Je vais souvent commencer avec quelque chose de simple et de moche et quand le "code odeur" devient trop mauvais ou je dois l'utiliser ailleurs, je vais le refactoriser en quelque chose de plus agréable et "rider" (sourire) – Steve

+0

Merci Tim, c'est le type de chose que je peux s'enliser, même si cela implique des fonctionnalités simples et seulement quelques lignes de code pour chaque extrait. Votre approche implique le moins de code et de répétition, et ne nécessite pas la création de nouveaux contrôleurs ou assistants pour une tâche aussi simple. Fait parfaitement sens! Chaque fois qu'il y a un code légèrement plus complexe que l'exemple de News, je pense que je vais ajouter une fonction statique au contrôleur le plus pertinent. – kenny99

0

Vous pouvez concevoir votre modèle MVC pour fournir un mécanisme permettant de renvoyer des données qui ont été définies en tant que groupe. Par exemple, normalement une requête Web vers /news/feed/ entraînerait la définition de données pertinentes et leur transmission ultérieure à une vue. En plus des requêtes Web, le système devrait également permettre à un contrôleur de faire une telle demande, c'est-à-dire, $vars = $this->call('/news/feed/'); Le système reconnaîtra la requête interne et retournera les variables définies au lieu d'invoquer une vue.

Cela vous permet de garder vos contrôleurs et vos modèles cohérents.

1

Vous voudrez peut-être regarder dans le modèle hiérarchique-View-Controller (HMVC). Il est particulièrement adapté à la création de pages avec des extraits. Je crois que Kohana l'implémente. Fondamentalement, vous avez plusieurs triades Modèle-Vue-Contrôleur, chacune responsable de chaque extrait. Vous pouvez donc avoir un contrôleur pour accéder à la base de données News et charger une variété de petites vues pour différents types d'affichages de nouvelles.

Questions connexes