Bonjour,

j'essaie de me passer de la fonction mail(), pour utiliser la bibliothèque PHPMailer.

J'ai une structure MVC qui utilise les "namespace" et un autoloader que voici :
<?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';
        }
    }
}

Je n'avais encore jamais essayé d'utiliser une bibliothèque PHP, et j'ai des "conflits" avec mon autoloader.

Ce que je fais

namespace App\Controller;
class UsersController extends AppController
{
    public function newAccount()
    {
        ...
        require ROOT . '/Vendors/PHPMailer/PHPMailerAutoload.php';
        $mail = new \PHPMailer;
        ...
    }
}

Ce que je veux

Quand je fais un "new PHPMailer", ça utilise mon autoloader au lieu d'utiliser l'autoloader de la bibliothèque de PHPMailer.
Moi ce que j'aimerai c'est que ça utilise l'autoloader de PHPMailer.

Ce que j'obtiens

Fatal error: Uncaught Error: Class 'PHPMailer' not found in
C:\xampp\htdocs\work\monSite\app\Controller\UsersController.php:226

la ligne 226 étant :

$mail = new \PHPMailer;

Ce que j'ai essayé

Enlever l'antislash quand je fais un new:

$mail = new PHPMailer;

ce qui m'a donné l'erreur :

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 47

La ligne 47 étant : (ligne 47 parce-que chez moi j'ai PLEIN de echo partout pour essayer de débuger)

require __DIR__ . '/' . $class_name . '.php';

J'ai essayé de mettre une condition dans MON autoloader pour gérer le cas "PHPMailer".
J'ai espéré qu'en chargeant l'autoloader de PHPMailer ça irait peut-être mais non :

static function autoload($class_name)
    {
        if (strpos($class_name, __NAMESPACE__ . '\\') === 0)
        {
            if (preg_match('/phpmailer/i', $class_name))
            {
                require dirname(__DIR__) . '/Vendors/PHPMailer/PHPMailerAutoload.php';
            }
            else
            {
                $class_name = str_replace(__NAMESPACE__ . '\\', '', $class_name);
                require __DIR__ . '/' . $class_name . '.php';
            }
        }
    }

J'ai essayé un million d'autres trucs foireux...

Voilà je sèche, ça fais quelques jours maintenant que je me tappe la tête contre les murs...
Si quelqu'un peut m'aider ^^

Merci.

1 réponse


SLK
Auteur

Bon, d'après ce que j'ai cru comprendre,
Il me semble j'essaie de faire quelque chose qui ne se fait pas, à savoir :
utiliser un autoloader personnel pour mes classes internes, ET essayer d'utiliser des classes externe (en l'occurence, celles de PHPMailer).
J'ai un conflit de chargement de classes, que je n'ai pas réussi à résoudre.

La solution que j'ai retenue est de me servir de Composer.

Je vais supprimer mon autoloader personnel, et utiliserai l'autoloader de Composer pour mes classes internes.
De plus, quand je voudrai utiliser une classe externe (disons PHPMailer au hasard), je me servirai également de Composer.