2016-06-05 4 views
0

Я пытаюсь использовать SwiftMailer для отправки транзакционных сообщений электронной почты, но я всегда получаю следующее сообщение об ошибке в email.php, когда я пытаюсь создать объекты SwiftMailer в:PHP - SwiftMailer автозагрузчик не работает

Warning: require_once(Swift/SmtpTransport.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Tutorials\E-commerce\inc\autoload.php on line 13 

Fatal error: require_once(): Failed opening required 'Swift/SmtpTransport.php' (include_path='C:\xampp\htdocs\Tutorials\E-commerce\classes;C:\xampp\htdocs\Tutorials\E-commerce\pages;C:\xampp\htdocs\Tutorials\E-commerce\mod;C:\xampp\htdocs\Tutorials\E-commerce\inc;C:\xampp\htdocs\Tutorials\E-commerce\template;C:\xampp\php\PEAR') in C:\xampp\htdocs\Tutorials\E-commerce\inc\autoload.php on line 13 

Дело в том, , Я включил автозагрузчики композитора и swiftmailer (отдельно), поэтому он должен найти классы. У меня есть собственный автозагрузчик, но если я включу автозагрузчик swiftmailer напрямую, даже если мой автозагрузчик не найдет классы, оператор include должен быть запущен и найти их правильно? Я могу заставить его работать, если я включу каждый класс отдельно, но это не очень практично.

Это моя структура каталоги:

index.php 
inc 
    config.php 
    autoload.php 
classes 
    SwiftMailer 
     vendor 
     composer.json 
     composer.lock 
    Url.php 
    Core.php 
    Email.php 
    Login.php 
    etc 
pages 
    login.php 
    basket.php 
    etc 
etc 

email.php:

<?php 

// I tried including them separately (also, php has no problem in finding them): 
require_once 'SwiftMailer/vendor/autoload.php'; 
require_once 'SwiftMailer/vendor/swiftmailer/swiftmailer/lib/swift_required.php'; 

class Email { 

    public function __construct() { 
     $this->objTransport = Swift_SmtpTransport::newInstance(); 
     etc 

autoload.php:

<?php 
require_once('config.php'); 

function generic_autoloader($class_name) { 
    $class = explode("_", $class_name); 
    $path = implode('/', $class) . '.php'; 
    require_once($path); 

} 

spl_autoload_register('generic_autoloader'); 

config.php:

It's a file where I define several constants (eg: classes directory, pages directory, root path..) and at the end I have this: 

set_include_path(implode(PATH_SEPARATOR, array(
    realpath(ROOT_PATH.DS.CLASSES_DIR), 
    realpath(ROOT_PATH.DS.PAGES_DIR), 
    realpath(ROOT_PATH.DS.MOD_DIR), 
    realpath(ROOT_PATH.DS.INC_DIR), 
    realpath(ROOT_PATH.DS.TEMPLATE_DIR), 
    get_include_path() 
))); 

Я не уверен, что это имеет какое-либо отношение к проблеме или нет (я следую учебнику, и я еще не совсем понял эту часть кода), поэтому я оставлю его здесь:

index.php:

<?php 
require_once('inc/autoload.php'); 

$core = new Core(); 
$core->run(); 

core.php:

<?php 

class Core { 
    public function run() { 
     ob_start(); 
     require_once(Url::getPage()); // Url::getPage just returns the path of the current page ($_GET['page']) 
     ob_get_flush(); 
    } 
} 

заранее спасибо!

+0

Возможный дубликат [Не удалось открыть поток: Нет такого файл или каталог] (http://stackoverflow.com/questions/36577020/failed-to-open-stream-no-such-file-or-directory) –

+0

Действительно ли вы установили SwiftMailer? он не отображается в вашей структуре каталогов –

+0

Да, я установил его с помощью композитора. Папка swiftmailer находится внутри моей папки классов. В нем есть 2 файла (composer.json и composer.lock), а также папка «vendor» (которая имеет два каталога, композитор и swiftmailer и файл autoload.php). PHP не показал ошибок, пытаясь включить файлы ... – Acla

ответ

0

Если в правой папке действительно есть файл SmtpTransport.php, кажется, что ошибка - это именно то, что он говорит: неправильное имя файла.

Вы должны заменить

$this->objTransport = Swift_SmtpTransport::newInstance(); 

по

$this->objTransport = SwiftMailer_SmtpTransport::newInstance(); 

Вы должны также включать в себя файл автозагрузку композитора (файл автозагрузку внутри поставщика)

 Смежные вопросы

  • Нет связанных вопросов^_^