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


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
Auteur

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

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
Auteur

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

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.

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! ;)

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.

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

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.

cf mon fw :D

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

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

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

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.

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

@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 :)

@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

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