IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

PHPMailer avec un Autoloader + Namespace


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut PHPMailer avec un Autoloader + Namespace
    Bonjour,

    Pour envoyer des mails j'utilisais la fonction email(), et j'aimerai m'en passer pour utiliser à la place la bibliothèque PHPMailer.

    J'ai une structure MVC, et j'utilise l’auto-chargement des classes, avec des namespaces.
    C'est l'auto-chargement des classes, que je maitrise très mal qui me pose problème, et c'est l'objet de mon post.

    J'ai téléchargé PHPMailer sur GitHub, et j'ai placé le dossier dans mon projet avec cette arborescence :

    monSite/Vendors/PHPMailer
    monSite/Vendors/PHPMailer/PHPMailerAutoload.php
    monSite/Vendors/PHPMailer/class.phpmailer.php
    monSite/App/autoloader.php
    monSite/App/Controller/UsersController.php

    Quand un utilisateur créer un nouveau compte, il appelle le controller UsersController, et l'action newAccout().

    Voici le code que j'utilise, avec les namespaces :

    Le controller qui (aimerait) instancie(r) PHPMailer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    namespace App\Controller;
     
    class UsersController
    {
        ...
        public function newAccount(// paramètres)
        {
            ...
            require_once('C:\xampp\htdocs\work\monSite\Vendors\PHPMailer\PHPMailerAutoload.php');
            $mail = new PHPMailer;
            ...
        }
        ...
    }
    {
    L'autoloader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    namespace App;
     
    class Autoloader
    {
     
    	static function register()
    	{
    		spl_autoload_register(array(__CLASS__, 'autoload'));
    	}
     
    	static function autoload($class_name)
    	{
    		if (strpos($class_name, __NAMESPACE__ . '\\') === 0)
    		{
    			$class_name = str_replace(__NAMESPACE__ . '\\', '', $class_name);
    			require __DIR__ . '/' . $class_name . '.php';
    		}
    	}
    }
     
    ?>
    L'erreur que j'obtiens :
    Warning: require(C:\xampp\htdocs\work\monSite\app/Controller\PHPMailer.php): failed to open stream:
    No such file or directory in C:\xampp\htdocs\work\monSite\app\Autoloader.php on line 26
    La ligne 26 de Autoloader.php est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require __DIR__ . '/' . $class_name . '.php';
    Pour débuguer j'ai mis un 'echo' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'DEBUG : ' . __DIR__ . '/' . $class_name . '.php<br>';
    Ce qui m'a donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEBUG : C:\xampp\htdocs\work\monSite\app/Controller\PHPMailer.php

    Ce que j'ai essayé pour résoudre le problème :

    J'ai rajouté un "use" avant ma class UsersController :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    namespace App\Controller;
     
    use Vendors\PHPMailer\phpmailer;
     
    class UsersController extends AppController
    {
        ...
    }
    et j'ai renommé :
    monSite/Vendors/PHPMailer/class.phpmailer.php
    par :
    monSite/Vendors/PHPMailer/phpmailer.php

    et je lui ai mis un namespace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    // monSite/Vendors/PHPMailer/phpmailer.php
    namespace Vendors\PHPMailer;
    ...
    Ce qui m'a donné comme erreur :
    Fatal error: Uncaught Error: Class 'Vendors\PHPMailer\phpmailer' not found
    in C:\xampp\htdocs\work\monSite\app\Controller\UsersController.php:211
    La ligne 211 de UsersController étant :
    J'essaie un million de trucs en fait en y allant en tâtonnant, je fais n'importe quoi.
    C'est pourquoi je vous appel à l'aide.

  2. #2
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut
    Excusez-moi je fais un petit up

Discussions similaires

  1. [Débutant] Parsing avec Xpath/Linq NameSpace
    Par patrickvier dans le forum VB.NET
    Réponses: 1
    Dernier message: 31/07/2013, 10h53
  2. probleme avec l'autoloader
    Par danidan75 dans le forum Zend Framework
    Réponses: 2
    Dernier message: 07/05/2011, 14h12
  3. [PHP 5.3] SPL, autoload, namespace et système
    Par Benj. dans le forum Langage
    Réponses: 1
    Dernier message: 25/02/2010, 13h27
  4. [ZF 1.9] Problème avec l'autoload
    Par Ibuprofène dans le forum Zend Framework
    Réponses: 3
    Dernier message: 05/02/2010, 16h31
  5. [SAX] [XSLT] Problème transformation XSL avec SAX et namespace
    Par thierry_b dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 17/12/2008, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo