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
Répondre
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!
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
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
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.
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.
- 1. vues intégrées et des ressources (mvc)
- 2. asp.net mvc rechercher et éditer des vues
- 3. validation ASP.NET MVC et des vues
- 4. ASP.NET MVC Compiler des vues dans des assemblages distincts
- 5. asp.net mvc avec des paramètres facultatifs et des vues partielles
- 6. MVC: relations de cardinalité des vues et des contrôleurs
- 7. ASP.NET MVC Globalisation des Vues
- 8. Utilisation des vues partielles dans ASP.NET MVC
- 9. des espaces dans les vues asp.net mvc
- 10. Gestion des exceptions ASP.NET MVC
- 11. Gestion des URL complexes dans ASP MVC
- 12. Gestion des inclusions dans MVC 2/MVCContrib
- 13. Gestion des caractères spéciaux - dans asp.net MVC
- 14. Gestion des erreurs dans asp.net mvc url
- 15. Gestion des erreurs dans ExecuteResult ASP.NET MVC
- 16. Gestion des cookies dans ASP.NET MVC
- 17. ELMAH et la gestion des exceptions dans ASP.NET MVC
- 18. Retour des données des contrôleurs aux vues dans asp.net mvc
- 19. Créer des extraits Wordpress
- 20. Gestion des événements dans les sous-vues de UITableViewCell
- 21. MVC transférer des données entre les vues
- 22. Utilisation d'ASP.NET MVC avec des vues génériques
- 23. Comment créer des extraits courts dans Vim?
- 24. travailler avec des extraits xml dans CKEditor
- 25. Gestion des erreurs pour ASP.NET MVC 2 et IIS 7.0
- 26. asp.net mvc - Vues et contrôleurs
- 27. Gestion des exceptions avec RenderAction Asp.Net MVC
- 28. Déclaration des présentateurs et des vues
- 29. Gestion de plusieurs vues et interactions
- 30. Utilisation des vues GSP dans Spring MVC sans Grails
+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