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 :
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 :
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 :
require __DIR__ . '/' . $class_name . '.php';
Pour débuguer j'ai mis un 'echo' :
echo 'DEBUG : ' . __DIR__ . '/' . $class_name . '.php<br>';
Ce qui m'a donné :
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 :
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 :
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.
Partager