Comment bien faire passer des données d'un contrôleur de point de vue?
Mon actuel de mise en œuvre:
class SomeController extends AppController
{
function someaction()
{
$d['text'] = "ahoy!";
$this->render("someactionView", $d);
}
}
Et dans AppController
:
function render($file, $data = "")
{
require "views/" . $file . ".php";
}
Et la $data
sera disponible dans les points de vue de fichier. Est-ce un corriger mise en œuvre? Existe-il des erreurs avec cette mise en œuvre?
Si un
Controller
est responsable de l'élaboration exigeant HTML (comme dans votre exemple), puis le contrôleur a empiété sur la responsabilité de l' View
. Si d'un point de vue peut avoir la présentation de la logique (par exemple, des boucles de dessin d'un tableau), alors que la logique devrait être dans la vue, ce qui pourrait être dans une méthode d'une classe.OriginalL'auteur good_evening | 2013-09-22
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous faites le mettre en œuvre, comme la plupart des cadres n'. Il ya un couple de problèmes avec ça:
require "views/" . $file . ".php";
dansrender()
méthode - vous de nouveau hermétiquement en couple. Que faire si vous changez l'emplacement des points de vue? Ensuite, vous avez à peu de réécrire votre méthode. Cette approche purement tue la réutilisation.Pour actualiser vos connaissances de base:
Contrôleur (aussi connu comme l'Éditeur)
Sert uniquement à but unique. Il change de modèle de l'etat - qui est, il devrait prendre une entrée qui vient de
$_POST
,$_GET
,$_FILES
,$_COOKIE
. Dans le contrôleur de l'attribution de la variable qui doit être fait et rien de plus.Vue
Vue dispose d'un accès direct à un modèle. Afin de faire faire des vues de plus réutilisable et facile à entretenir vous feriez mieux de passer les choses nécessaires comme les paramètres de la fonction (ou via des setters)
Comment la vue doit être initialisé et comment les variables doivent être transmises?
Tout d'abord, point de vue doit être instancié à l'extérieur MVC-triade. Depuis un contrôleur écrit, soit de vue ou d'un modèle, vous allez passer des variables à afficher via le contrôleur.
1) Une vue communique avec un modèle directement soit par l'intermédiaire de
factories/service locators
2) Il est appeléFront Controller
. Il y en a plusieurs composants de son fait (Routeur, Répartiteur, la Réponse de l'expéditeur). Le truc, c'est : il gère toutes les demandes via un seul endroit. Vous pouvez voir l'ensemble de son œuvre enZend Framework/library/Mvc
. Comme pour bien commencer, je vous recommande cette r.je/mvc-in-php.htmlTout d'abord, actuellement, je suis plus un script shell codeur. La dernière fois que j'ai code web que j'avais: Routeur qui crée le contrôleur en fonction de la demande, Le contrôleur(présentateur, j'ai appris) communique ensuite avec le modèle et transmet les résultats à la vue. La vue encapsule les fonctionnalités comme le modèle de rendu, la traduction, la dynamique de javascript. J'ai lu que le MVP, c'est exactement ce que je veux dire. L'initialisation du modèle et de la vue où codés avec les niveaux, mais le présentateur a été responsable de la création de leur
Je ne vois pas d'où la vue communique avec le modèle dans ton exemple. Vous venez de passer
$vars
à partir du contrôleur, comme moi d'appelerassign()
. Aussi, vous êtes de passage le nom d'un modèle comme moi. Où est la différence (dans ton exemple) ? La différence que je vois, c'est que vous appelezrender()
de laFrontController
.. Qui semble intéressant..il devrait être
$controller = new Controller($model, $view);
à moins qu'il existe plusieurs présentations du même modèle et de même dans un cas particulier, l'utilisateur n'a pas de capacité d'influer sur la couche modèle.OriginalL'auteur Yang
De l'OMI le
render()
méthode appartient à la vue et à ne pas le contrôleur. Le code devrait ressembler à ceci:Contrôleur:
Vue De La Classe De Base:
Étendre la classe d'Affichage
Ouais , la "littérature" est faite par des gens comme Fowler, Burbeck, Evans et Cunningham. Et votre littérature est faite par 37signals.
J'ai juste gardé les choses simples comme dans la question. Bien sûr modèle, le chargement est propre logique.
OriginalL'auteur hek2mgl
Réponse courte: non et plusieurs.
Tout d'abord, ce que vous avez n'est pas une vue. C'est juste un idiot template php. Les vues MVC sont instance, qui contiennent la logique de l'INTERFACE utilisateur de l'application. Ils extraire des informations à partir du modèle de la couche et sur la base des informations qu'ils reçoivent, de créer une réponse. Cette réponse peut être un simple texte, document JSON, HTML, page assemblés à partir de plusieurs modèles ou tout simplement un en-tête HTTP.
Comme pour la manette, c'est la seule tâche consiste à modifier l'état de la couche du modèle et (rarement) le point de vue actuel. Les contrôleurs de ne pas initialiser les points de vue, ni ne les remplir modèles.
Je ne voudrais pas confirmer cela. Si vous n'êtes pas à peupler les données du contrôleur à la vue, la vue n'est pas indépendant en plus et vous avez un fort couplage entre le modèle et la vue.
le point de vue sera instancié à l'extérieur du contrôleur et transmise comme une dépendance. Et les données de la vue ne serait pas passé dans, au lieu de la vue pourrait appeler des services de couche du modèle et d'obtenir toutes les données dont il a besoin. Cela voudrait aussi dire que les vues sont faite pour l'interface de la couche modèle.
c'est un très contestable de la conception. Il peut être fait, mais comme je l'ai dit, cela vous donne un fort couplage entre modèle et de la vue.
S'il vous plaît aller lire ce "couplage" est réellement et quelles sont les causes de l'est, parce que vous n'avez aucune idée de ce dont vous parlez.
OriginalL'auteur tereško