Bonjour à tous,

Je suis développeur web depuis quelques années déjà, jusque la je m'étais créé ma petite architecture basée sur le modèle MVC mais j'ai décidé de voir ce qui se faisait ailleurs et je suis tombé sur cet excellent tutoriel. Je suis donc en train de mettre en application cette organisation, la grande différence avec mon architecture c'est qu'ici on manipule exclusivement des classes, se pose alors le problème du passage de variable. Je m'explique :
j'ai besoin d'utiliser une librairies (PHPMailer pour ceux qui connaissent), j'ai donc créé un fichier qui inclut la librairie, créé un objet et lui applique mes paramètres de base. Mon fichier est ensuite inclut dans mon dispatcher, jusque la rien de compliqué, j'ai repris ce que je faisais avant. Maintenant je dois récupérer mon objet dans mes classes contrôleurs pour l'exploiter, mais comment faire ? La seule solution que je vois est de passer cet objet en paramètre de mon contrôleur leur de son initialisation mais si j'ai besoin de 10 ou 20 librairies ça risque de devenir un peu lourd... Sans compter que les contrôleurs sont appelés de cette façon :

<?php $controller = new $controller();?>

Il faudrait donc que je prévois de passer mon objet à tous mes contrôleurs (même ceux qui ne l'utiliseront pas) et donc de créer une fonction __construct() pour chacun d'eux sachant que si je souhaite abandonner une librairie plus tard il me faudra modifier tous ces contrôleurs...

Alors je pose la question sans trop y croire mais y a t'il un autre moyen ?

Merci d'avance pour vos conseils :)

1 réponse


bonjour
j'ai comme l'impression que tu n'as pas bien assimilé le principe même du mvc. dès lors que tu adopte une telle structure, tu dois te dire que chaque fonctionnalité de ton site résulte d'une application(composant). en dehors des fichiers qui constituent le socle même de ton achritecture(controller.php, model.php, dispatcher.php), tu ne dois faire appel à des librairies externe que si celà est nécessaire. en clair, inclure des librairies au niveau du dispatcher ne fera qu’alourdir le site car celle-ci seront chargées même pour les pages dont elles n'ont aucune utilité. pour phpmailer par exemple, tu ne doit de ne l'inclure et l'instancier qu'au moment d'envoyer ton mail; pas dans le dispatcher , ni dans le controller principal.
exemple:
si ton site possède un formulaire de contact(page de contact), alors parmi les applications de ton site on doit en trouver une qui se nomme "contact". si tu souhaite qu'à chaque soumission de formulaire une copie soit expédiée dans la boite mail de l'admin ou tout simplement une notification, dans la méthode "index()" (c'est la vue index qui contient le formulaire) du controller on aura grosso modo ceci:

class contactController extends Controller
{
/**
*
*
**/
public function index()
{
    $d =array();
if( !$this->Session->isExpired() and $this->request->Postdata )
    {
                                $this->loadModel('Contact');
                if(!$this->Contact->validates($this->request->Postdata)) //validation du formulaire
                {
                    $this->Session->setFlash($this->Contact->errors, 'error');
                                        return false;
                }

                $mailTo = 'admin@email.site';//email de l'admin peut provenir de la bdd 
                /* the email body */
                    $msg='Expéditeur: '.$this->request->Postdata->name.'<br />Son Email:    '.$this->request->Postdata->email.'<br />Adresse IP: '.ipAddress().'<br /><br />
                    Message:<br /><br />'.nl2br($this->request->Postdata->message);
                                        require 'chemin_vers_la _classe_phpmailer';
                    $mail = new phpMailer();    /* using PHPMailHelper */
                    $mail->IsMail();
                    $mail->AddReplyTo($this->request->Postdata->email, $this->request->Postdata->name);
                    $mail->AddAddress($mailTo);
                    $mail->SetFrom($this->request->Postdata->email, $this->request->Postdata->name);
                    $mail->Subject = ucfirst($this->request->Postdata->title);
                    $mail->MsgHTML($msg);
                    //$mail->AddAttachment('images/phpmailer.gif'); // attachment
                    //$mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
                        if(!$mail->Send())
                        {
                            $this->Session->setFlash( $mail->ErrorInfo, 'error');
                        }
                        else
                        {  
                            $this->Session->setFlash( 'Message envoyé!', 'success');
                            //$this->redirect('');
                        }   

          } 
  $this->set($d);
}
}