PHPMailer в Codegniter 4.0.0

Я пытаюсь вызвать свою библиотеку Phpmailer в контроллере. Я знаю, что для выполнения этой задачи существует библиотека фреймворка, однако я все же предпочитаю PHPMailer. Я следовал руководству по интеграции библиотеки в фреймворк в версии 3.0.0, очевидно, что это вызвало бы некоторый конфликт. Как вызвать мою библиотеку PHPMailer в Codeigniter 4.0.0?

Учебное пособие: https://www.codexworld.com/codeigniter-send-email-using-phpmailer-gmail-smtp/

Моя библиотека:

<?php
namespace App\Libraries;
use CodeIgniter\Libraries; 
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

defined('BASEPATH') or exit('No direct script access allowed');

class Phpmailer {

    public function load(){
        require_once APPPATH.'ThirdParty/PHPMailer/Exception.php';
        require_once APPPATH.'ThirdParty/PHPMailer/PHPMailer.php';
        require_once APPPATH.'ThirdParty/PHPMailer/SMTP.php';
        
        $mail = new PHPMailer;
        return $mail;
    }
}

Мой контроллер:

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use App\Libraries\Phpmailer;

class Retrieve{

    public function send($email){

        $this->load->library('phpmailer'); //line 10
        $mail = $this->phpmailer->load();
        
        // SMTP configuration
        [...]
    }
}

Здесь функция получения описания изображения вызывается другим методом, поэтому она работает. Проблема в том, что моя библиотека не загружается. Я получаю следующую ошибку:

ErrorException
Неопределенное свойство: App_Controllers_Retrieve: $load
APPPATH/Controllers_Retrieve.php : 10 - CodeIgniter_Debug_Exceptions-›errorHandler

[1]: https://i.stack.imgur.com/O49B7.png
[2]: https://i.stack.imgur.com/xUUIQ.png


person Tavinho    schedule 06.12.2020    source источник
comment
Наличие собственного класса и PHPMailer с использованием имени, отличающегося только в случае, кажется неразумным. Дайте PHPMailer псевдоним, чтобы избежать путаницы. Ошибка выглядит как проблема с именованием классов, расположением и загрузкой, чем с PHPMailer. У вас нет возможности использовать композитор? Это намного лучше, чем это.   -  person Synchro    schedule 06.12.2020


Ответы (1)


Сама ошибка проста, но я подозреваю, что за ней стоят более серьезные проблемы.

Неопределенное свойство: App_Controllers_Retrieve: $load

Это не проблема пространства имен, вы пытаетесь получить доступ к чему-то, чего не существует.

$this->load-> ... //line 10 пытается получить доступ к свойству load $this (контроллера), которого, насколько вы нам показали, не существует.

Для этого нет реального исправления в одну строку. То, как вы пытаетесь «загрузить» библиотеку в контроллер, — это не то, что вы хотите делать (проверьте класс Services в CI4, я думаю, это то, что вы себе представляете).

Это самый простой способ, на мой взгляд:

Дайте библиотеке конструктор. Создайте/сохраните объект PHPMailer внутри него и выполните работу по отправке писем в саму библиотеку. Например:

  <?php
  namespace App\Libraries;
  use PHPMailer\PHPMailer\PHPMailer;
  use PHPMailer\PHPMailer\Exception;

  defined('BASEPATH') or exit('No direct script access allowed');

  class Phpmailer {

    private $mailer;

    function __construct(){
      $mailer = new PHPMailer\PHPMailer\PHPMailer();
    }
    //Example - do some work
    public function send(){
      
    
      // SMTP configuration
      ...

      if ($this->mailer->send())
      {
        ...
      }

    }

    ...
  }

Большое примечание: если вы не измените имя своей библиотеки, вам, вероятно, придется ссылаться на реальный PHPMailer по его полному пространству имен: например, new PHPMailer\PHPMailer\PHPMailer();

Затем ваш контроллер может просто создать новый экземпляр вашей библиотеки, когда ему понадобится эта библиотека для работы.

<?php
  namespace App\Controllers;
  use App\Libraries\Phpmailer;

  class Retrieve extends BaseController {

    public function send($email){

      $mailLibrary = new Phpmailer();
      $mailLibrary->send();

    }
}

Вместо useing CodeIgniter\Controller напрямую используйте класс(ы) Controller extend BaseController. Затем, если вам нужно добавить что-то в родительский класс ваших контроллеров, вы не касаетесь «системных» файлов фреймворка.

Если вы хотите иметь эту библиотеку постоянно, вы можете вместо этого сделать ее свойством класса вашего контроллера и создать ее при создании самого контроллера, чтобы она всегда была рядом.

Это предполагает, что у вас есть фактический PHPMailer там, где он должен быть, и инфраструктура CI загружается автоматически. Если вы не установили CI/PHPMailer через Composer, я бы серьезно посоветовал вам перенести свой проект на установку, которая была. Это избавит ваш проект от технического долга на всю жизнь и значительно упростит работу с пространством имен.

person parttimeturtle    schedule 08.12.2020