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.