Aller au contenu

MVC : Appeler plusieurs controleurs ?


Sujets conseillés

Posté (modifié)

Bonjour,

Je me suis lancé dans le développement d'une application MVC en php pour accélerer mes dev web.

Je vais vous expliquer ma vision de l'appli, ma manière de penser pour ensuite vous exposer mon problème (oui sinon je posterai pas :)).

url appelée : domaine.com/nomcontroleur/nomaction

controleur frontal : index.php

controleur (appelé par le frontal) : nomcontroleur.class.php

abstract class controleur {

protected $modele;
protected $vue;

public function __construct($db)
{
$this->db = $db;
}

public function getVue()
{
return $this->vue;
}

public function getModele()
{
return $this->modele;
}

abstract function events($args);

}

class events extends controleur {

private $result;

public function __construct()
{
$this->result['page'] = 'event-article';
}

public function read($args)
{
$this->eventsDao = new eventsDao($this->db);
$this->result['events'] = $this->eventsDao->getEvents();
$this->modele = $this->result;
$this->vue = 'tpl.events.html';
}

}

Le controleur définit le modèle et la vue. Enfin je charge mes templates smarty. Aucun problème.

Mais voilà, ma page (http://micromediateam.com/proto/) contient des éléments récurrents. Exemple : une boite sponsors, une boite news.

Or, j'ai plus ou moins découpé mes controleurs par rapport aux métiers :

un controleur news (pour afficher les news, ajouteru une news, etc.).

un controleur events

etc.

Donc finalement, il faudrait que j'appelle plusieurs controleurs pour une requête donnée.

exemple : domaine.com/events (http://micromediateam.com/proto/event.php)

doit appelé le controleur events, le controleur head sponsor, le controleur sponsors, supporters, etc.

Ma première idée fût de rajouter dans chacun de mes controleurs l'accès aux données des modules demandées. Mais du coup, mes contrôleurs n'ont plus vraiment de sens. On retombe sur une page => un controleur qui appelle les modèles.

Comment procéder ?

Faut-il que selon l'url demandée (events/read), je traite cette chaine. Dans, un fichier externe je stocke les rubriques à afficher pour chacune des pages. Et j'appelle en conséquence les controleurs ?

Exemple (très simpliste) :

$events = array('hsponsors', 'sponsor', 'supporter');
foreach($events as $controleur)
{
$c = new $controleur();
}

Enfin, par extension, des modules comme l'identification, gestion d'un panier doivent-ils être gérés par un controleur spécifique ?

J'ai besoin d'y voir plus clair !

Merci d'avoir lu mon problème d'une limpidité digne de la mer méditérannée.

Modifié par NicKy
Posté

Bonjour,

Plusieurs choses que je trouve étrange :P :

- 1 controleur => 1 vue, pour le web c'est normal, par contre 1 controleur => 1 objet modèle ça me parait bizarre.

- Une variable d'instance $db dans le controleur c'est aussi étrange. C'est plutôt dans le modèle ce genre de chose ^^.

- Que ta classe "events" soit une sous-classe de ta classe "controleur", ça me choque aussi ;). D'abord je ne vois pas à quoi ça peut te servir et ensuite tu vas perdre en souplesse (par exemple si te venait à l'idée d'implémenter un sous-controleur qui aurait des propriétés spécifiques tu ne pourrais plus étendre ton contoleur actuel...).

Concernant ta question, je n'ai pas de réponses toute faites. D'autant que je me suis aussi pris la tête avec ces problèmes et que je ne suis pas sûr du tout de m'en être bien tiré...

1 module=1 controleur ça me parait bien. Faire en sorte qu'1 controleur ne dépende pas d'1 autre controleur ça me parait bien aussi. J'ai personnellement intégrer tous ma logique d'appels aux controleurs à l'intérieur du frontControleur et je gère ça, comme dans ton exemple simpliste ;), à l'aide de tableaux.

Bon courage

Posté (modifié)

Après réflexion, j'ai décider d'opter pour cette solution :

url : /mapage/arguments/

appels aux controleurs grâce à un fichier xml :

<page name="index">
<title>MicroMediateam - Home</title>
<meta>
<description>Welcome to the homepage of MicroMediaTeam</description>
<keywords>micro, media, micromedia, micromediateam, starcraft, broodwar</keywords>
</meta>
<style>index</style>
<modules>
<module>
<controleur>news</controleur>
<action>newsList</action>
</module>
</modules>
</page>

Instance des controleurs (après traitement xml etc.):

		foreach($modules->module as $mod)
{
$tempC = ''.$mod->controleur;
$tempA = ''.$mod->action;
$controleur[$tempC] = new $tempC();
if (is_callable(array($tempC, $tempA)) == false) {
$this->notFound('no-action');
}
$controleur[$tempC]->$tempA($args);
}

Voilà ca fonctionne parfaitement mais .. je n'ai pas encore eu à traiter des action sur un formulaire (POST, GET..etc) mais action sont limitées au simple appel de données. J'espère que mon modèle ne va pas me bloquer à ce niveau là.

Merci pour vos critiques.

Modifié par NicKy

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...