Bonjour, voilà je suis un étudiant et j'aimerai en apprendre d'avantage sur le concept du codage en MVC pour php.
J'ai eu du mal à comprendre les bases, j'ai revu et revu des dizaines de fois tes vidéos super bien expliquées, j'ai fait des recherches sur d'autres site, pour mieux comprendre.
Et j'ai réussi à avoir un bout de site qui me permet d'avoir un petit site façon MVC, du moins le début.
Car je comprend qu'on appelle un contrôleurs par la barre d'adresse avec les différentes actions etc ...
Mais par exemple j’atterris sur mon site : monsite.org/accueil -> cela appel bien mon contrôleur accueil qui gère mes articles. Mais comment faire pour introduire depuis la vue un contrôleurs partenaires, menu ou autres choses que l'on trouve généralement sur une page d’accueil.
Je ne sais pas si j'ai était clair ce n'est pas facile d'expliquer ;)
Merci a vous si vous voulez plus d'explication ou autres je suis là.

10 réponses


elscorto
Réponse acceptée

Salut,

si je me rappelle, les controllers prennent un objet request lors de l'instanciation, la seconde erreur en découlerai.

Pour la rédéfinition de la class Config, tu dois avoir 2 classes config, en voyant tes codes, je dirai que tu as ton model Config mais aussi la classe Config qui comprend la configuration de ton site qui doit se trouver dans le dossier config.

Les includes ne changent pas,
pour ton code situé "monsite.org/vue/accceuil.php" et que tu veut faire un include (pour menu ...etc) d'un fichier qui ce trouve dans le dossier "vue" tu ferra "include_once('vue/ton_ficher')" même chose pour les images, scrypt, css...

Ok d'accord merci, donc si dans ma page accueil je veux utiliser un autre controleurs que AccueilControleurs. Par exemple MenuControleurs J’inclue include_once("controller/MenuControleurs.php"); Et j'utilise mes fonctions comme d'habitude n'est ce pas ?
Mais ce n'est pas très MVC de faire des includes non ?
Merci encore pour ta réponse rapide ;)

C'est sa,
l'architecture MVC n'interdit pas de faire des include(), tu en est obligé.

Voila je n'arrive toujours pas à afficher ce que rend normalement mon controleur à la vue. Cela doit être tout bête mais depuis hier soir je suis dessus et je craque ^^
Je voudrai enfaite faire un ConfigControleur qui gèrerai tout ce qui est config du site: titre, slogan, description, mot-clés ...
La sur mon site je vois bien mon AccueilControleur qui affiche les articles, mais la j'ai inclut comme vous m'avez dit dans le layout default car les configs seront visible sur toutes les pages.
Et il me dit que ma variable existe pas, merci beaucoup d'avoir déjà pris du temps pour répondre a un petit débutant comme moi ^^

ConfigController

class ConfigController extends Controller {

    function __construct(){
        $this->loadModel('Config'); 
        $configs = $this->Config->recherche(array(
        ));
        $this->set('configs',$configs); 
    }
}

default.php

<div id="entete">

<?php include_once(ROOT.DS.'controller'.DS.'ConfigController.php');

print_r($configs); ?>

</div>

Je sais pas si ça fonctionne mais moi j'aurais fait:
ConfigController

class ConfigController extends Controller {
    function getConf(){
        $this->loadModel('Config'); 
        return $this->Config->recherche(array(
        )); 
    }
}

default.php

<div id="entete">
    <?php $configs = $this->request('Config', 'getConf'); ?>
    <?php debug($configs); ?>
</div>

J'ai remplacé comme tu ma suggéré et il me met cette erreur :
Fatal error: Call to undefined method AccueilController::request()in /view/layout/default.php on line 13

Ce qui est normal j'ai pas de method request dans AccueilController, et je ne vois pas pourquoi il me parle de AccueilController.

tu as pas fait exactement comme le tuto de Grafikart sinon t'aurais une méthode request() dans Controller et il te parle de AccueilController car tu est sur ta page d'accueil.

Sinon pour lancer le controller comme tu le fesais il faudrait que tu l'instancie en fesant $configs = new ConfigController(); et que tu fasse un return dans ton constructeur sinon $configs sera toujours vide.

Si j'ai suivi la vidéo du model MVC, et aussi les premières vidéos de faire un site de A a Z. J'ai télécharger les sources du jour 7, pour voir la fameuse méthode request je l'ai ajouter à mon code. Dans le contrôleur principal.

Controller

function request($controller,$action){
    $controller .= 'Controller';
    require_once ROOT.DS.'controller'.DS.$controller.'.php';
    $c = new $controller();
    return $c->$action();
}
}

Et voila l'erreur,

Warning: Missing argument 1 for Controller::__construct(), called in /home/stix/newt/core/Controller.php on line 71 and defined in /home/stix/newt/core/Controller.php on line 17 Notice: Undefined variable: request in /home/stix/newt/core/Controller.php on line 18 Fatal error: Cannot redeclare class Config in /home/stix/newt/models/Config.php on line 9

Du coup je suis perdu là j'utilise la méthode avec le request ou j'instancie à chaque fois, mais c'est moins pratique non ?

Merci beaucoup à vous deux pour votre patience, je partage le code pour ceux ou celles qui on eu les mêmes soucis.

ConfigController

class ConfigController extends Controller {
var $request;
function __construct(){
        $this->request = new Request();     
   function getConf(){
       $this->loadModel('Configs');
       return $this->Configs->recherche(array(
       ));
    }
}

default.php

<div id="entete">
<?php include_once ROOT.DS.'controller'.DS.'ConfigController.php'; ?>
<?php $configs = new ConfigController(); ?>
<?php $configs = $this->request('Config','getConf');?>
<pre><?php print_r($configs); ?></pre>
</div>