Envoyer variable à la vue

Par Skraf, il y a 9 ans


Bonjour,

Bonjour,

J'ai besoin d'aide parce que je suis en train de créer un système MVC, mais je suis bloqué, parce que j'arrive pas à envoyer la variable du controller à la vue.

Voici mon ControllerController.php ( pour la vue )

class ControllerController extends Controller {       function __construct()     {         }       public function index(){         $t = "fr";         echo "de";       }   }

Je voudrais le système d'envoi à la vue dans la fonction " set " de mon Controller.php ( Dans le noyau ) :

class Controller {     public function set($name, $msg){       if (isset($name) && isset($msg)) {                 }     }   }

Si vous avez une documentation ou un script, je suis prenant :)
Merci de votre aide,
Cordialement

17 réponses

quenti77, il y a 9 ans

cf mon fw :D

En vrai je me suis bien aider des différents tuto et en regardant les code de framework plus connu

Moussa Ball, il y a 9 ans

Moi j'utilise laravel mais symfony pour moi c'est la jungle mais quand même il fait partie des meilleurs framework

AlexJM, il y a 9 ans

Bonjour,

Je pense que faire ceci devrait fonctionner :
Tu crées une classe View par exemple :

class View { protected $file; protected $values; public function __construct ($file) { //Tu stockes le nom du fichier $this->file = $file; } public function set ($key, $value) { //Ici tu peux faire plus de traitement, si tu veux, mais tu peux aussi laisser comme ça $this->values[$key] = $value; //Tu retournes ceci pour pouvoir chaîner. Mais pas obligatoire return $this; } public function make ($view) { //Ici tu crées toutes les variables : foreach ($this->values as $key => $value) { ${$key} = $value; //Je pense que ceci devrait fonctionner, mais je n'ai pas testé donc pas sûr } //Ici tu ob_start, require ta vue (dont le fichier est $this->file)... } }

Et puis pour l'utiliser, c'est simple, dans ton controller :

$view = new View('ton fichier'); $view->set(..., ...)->set(..., ...); return $view;

Et ensuite dans ton router (je pense), tu regardes si le type de sortie c'est une vue, et si c'est une vue tu fais $view->make();

Note, si tu veux absolument mettre les fonctions dans ton controlleur, je te conseille vivement de "mapper" les fonctions de la vue, une classe ne devrait servir que dans une optique, gérer les vues n'est pas le but d'un controller. Après, je dis ca pour la propreté, la simplicité et la maintenabilité (je sais plus comment on dit) de ton code ;)

Skraf, il y a 9 ans

Bonsoir,
J'ai décidé de mettre dans mon controller la méthode " set " mais ma variable ne s'affiche pas.
Voici le code de mon Controller principal:

namespace Phonix\Kernel\Controller; /** * Controller */ class Controller { protected $values; public function getModel($model){ } public function render(){ } public function getComponent(){ } /** * @param $key * @param $value * @return $this */ public function set($key, $value){ $this->values[$key] = $value; return $this; } } ?>

Voici le contenu de mon Controller de test :

... use Phonix\Kernel\Controller\Controller; class ControllerController extends Controller { function __construct() { } public function index(){ $t = "fr"; $this->set('t', $t); echo "de"; return $this; } }

Voici le code de ma vue du controller:

<?php echo $t; ?>

Cordialement

AlexJM, il y a 9 ans

Je vois pas trop comment tu veux faire, parce que si tu veux des vues, il faut aussi donner le nom de ta vue, or dans ce que tu veux faire tu l'as nulle part

Skraf, il y a 9 ans

Je sais pas si ça sera utile, mais j'ai pas de routeur pour le moment et voici mon fichier " Request " qui gère l'appel du controller et de la vue :

namespace Phonix\Kernel\Router; use Phonix\Kernel\Flash\Flash; class Request{ function __construct() { $this->Flash = new Flash(); } public function load(){ $e = explode('/', $_SERVER['REQUEST_URI']); if (file_exists(APP . DS . 'Protection'. DS .'Controller' . DS . $e[1] . 'Controller.php')) { $controller = '\\Phonix\App\Protection\Controller\\' . ucfirst($e[1]) . 'Controller'; $controller = new $controller(); if (isset($e[2])) { if (preg_match('/\.(php)$/i', $e[2])) { $r = ''; }else{ $r = '.php'; } if (isset($r)) { if (file_exists(APP . DS . 'Public' . DS . 'Templates' . DS . $e[1] . DS . $e[2] . $r) && method_exists($controller, $e[2])){ require(APP . DS . 'Public' . DS . 'Templates' . DS . $e[1] . DS . $e[2] . $r); $controller->$e[2](); }elseif(!$e[2]) { if (method_exists($controller, 'index')) { require(APP . DS . 'Public' . DS . 'Templates' . DS . $e[1] . DS . 'index' . $r); $controller->index(); }else{ $this->Flash->errorExit('Impossible de trouver la vue.'); } }else{ $this->Flash->errorExit('Impossible de trouver la vue.'); } }else{ $this->Flash->errorExit('Erreur interne: 50)'); } } }else{ $this->Flash->errorExit('Impossible de trouver le controller.'); } } } ?>

Cordialement

quenti77, il y a 9 ans

Je sais pas comment tu gères ton mvc mais maintenant de mon côté j'ai une classe abstraite 'Message' et des classes enfant pour les différentes type de vue possible. Après j'utilise blade qui n'a pas besoin de laravel.

Pour plus d'informations je te renvoie à mon github.

Kaelyscius, il y a 9 ans

Hello ! Si tu galère à créer un MVC, regarde du côté de la formation php de grafikart. Ca te permettra à la fin d'avoir un système MVC que tu peux facilement améliorer. Au moins ça te donnerai une piste pour voir comment en créer un par toi même ensuite! ;)

Moussa Ball, il y a 9 ans

la fonction

call_user_func_array();

permet d'envoyer des variables à la vue;
et sa doit prendre je crois trois paramètres l'un dernier doit être un array pour les méthodes sinon regarde sur y'a pas mal de mvc.

Lartak, il y a 9 ans

Bonjour.

permet d'envoyer des variables à la vue;

Tiens donc, depuis quand la fonction call_user_func_array() permet elle de transmettre des variables à une vue ? o_o

Moussa Ball, il y a 9 ans

Excuse je me suis trompé c'est juste que sa recupère les paramètres de l'url sous forme de variable.
Pourtant c'est pas compliqué de mettre en place une structure mvc.

cid5420, il y a 9 ans

franchement moi je me sert de celui de grafikart dans tout mes projets, je l'ai amélioré. C'est vraiment une très bonne base pour commencer et ça t'apprend comment fonctionne le MVC

Moussa Ball, il y a 9 ans

Pourtant sur github, y'a pas mal de mvc. Mais en générale on organise le code au cas il y'aurait d'autre développeur.

E-Bismuth, il y a 9 ans

Personnellement je me suis aussi créer un mini framework avec l'aide de grafikart et pour les variables j'utilise une classe ou je stock mes variable dans un array ce qui  a en plus l'avantage d'être très pratique lorsque je cherche sous quelle nom la variable est enregistré.
Je t'invite à voir mon github: https://github.com/E-Bismuth/SimpleFramework

quenti77, il y a 9 ans

@E-Bismuth, ton framework me rappel un peu la toute première version du mien quand j'avais commencé ^^
Je t'es follow et star ton projet pour le suivre au cas ou :)

E-Bismuth, il y a 9 ans

@quenti77 Merci, j'essaye de l'ameliore mais j'ai pas eu beaucoup le temps c'est dernier temps, ya pas mal de chose a arrange notament toutes la partie sur les variable qui se repette souvent et ou il faudrait que je fasse une abstraite parent, mais il assez pratique, surtout de pouvoir creer des "define" ou je peut mettre des class entiere et avec un pti

var_dump(projectDefine::getAll());

Je peut voir tous mes define sans avoir a chercher ou je les ai definie pour retrouver sous quel clef je les enregistre

quenti77, il y a 9 ans

Cela peut-être utile en effet même si dans le miens j'en ai pas eu besoin pour le moment ^^