Composer и автозагрузка в ООП PHP. Phpmailer

Composer и автозагрузка
Отделение ядра приложения от пользовательских классов




Подключение сторонней библиотеки

Composer

Отделение ядра приложения от пользовательских классов



Подключение сторонней библиотеки




Попробуем подключить библиотеку, например, phpmailer - это библиотека, которая позволяет отправлять почту. Для этого создадим папку phpmailer и распакуем туда папки из библиотеки: папку language и папку src.


Содержание папки 13 ("Composer и автозагрузка"):


13-1



Для того, чтобы использовать библиотеку необходимо:

во первых - импортировать PHPmailer в пространство имен,

во вторых - подключить классы - с ними справится автозагрузчик.


Подключаем PHPmailer.php из папки src (по документации библиотеки PHPmailer) (для АВТОЗАГРУЗКИ):

- require_once 'phpmailer/src/PHPmailer.php';


Для того, чтобы использовать библиотеку необходимо создать объект класса PHPMailer:

- $mail = new PHPMailer\PHPMailer\PHPMailer();

- debug($mail); - распечатываем этот объект.


Файл index.php:


-- index.php --

<?php
use classes\{BookProduct, NotebookProduct};
use classes\interfaces\{IGadget, I3D};

// Подключаем PHPmailer.php из папки src (по документации библиотеки PHPmailer)
// ( для АВТОЗАГРУЗКИ )
require_once 'phpmailer/src/PHPmailer.php';

error_reporting(-1);

// Опишем функцию автозагрузки ( для АВТОЗАГРУЗКИ )
function autoloder1($class)
{
echo $class . "<br>"; // для проверки
$class = str_replace("\\", "/", $class);
$file = __DIR__ . "/{$class}.php";

if(file_exists($file))
{
require_once $file;
}
}

spl_autoload_register('autoloder1');


// создаем объект $mail класса PHPMailer
$mail = new \PHPMailer\PHPMailer\PHPMailer();
debug($mail); // распечатываем этот объект

?>
Выведет:
PHPMailer\PHPMailer\PHPMailer Object
(
[Priority] =>
...
...
...




- объект класса PHPMailer - создался. Здесь встает вопрос - зачем нужен автозагрузчик, который не совсем справляется с такой работой (так как пришлось подключать вручную - require_once 'phpmailer/src/PHPmailer.php', или можно было создать еще один загрузчик для библиотеки PHPMailer). А если таких библиотек будет много?

В этом случае нам на помощь приходит пакетный менеджер Composer и придут на помощь стандарты PSR (PSR). Эти стандарты регламентируют (стандартизируют) написание кода. (PSR-4 – Улучшенная автозагрузка).



Composer




Для работы с композером (автозагрузка с помощью композера):

- удаляем объект $mail,

- удаляем подключение PHPmailer.php,

- удаляем папку phpmailer (мы ее будем использовать и загружать из композера),

- размещаем классы по разным папкам (ядро и приложения).

Для работы с композером создаем файл composer.json (папка 13):


Файл composer.json:


-- файл composer.json --

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

"require": {},

- второй ключ - здесь мы указываем, согласно какому стандарту, мы
- хотим производить автозагрузку: "psr-4". Здесь мы должны указать,
- согласно данному стандарту, где находятся наши классы (папка "classes\\"
- второй слэш - экранирующий) и задать для них псевдоним;
- мы указываем, если ты встретишь в пространстве имен "classes\\",
- тогда заходи в папку "classes" и все классы ищи именно там.

"autoload": {
"psr-4":{
"classes\\": "classes"
}
}
}




Заходим в Open Server и открываем консоль.

Заходим в наш проект: cd domains\PHPoop1\13 и жмем "Enter" - переходим в нужную нам папку.

Выполняем команду: composer install -> "Enter" - данная команда, основываясь на файле composer.json, создаст нужный нам автозагрузчик по стандарту psr-4 и создаст папку vender, в которую поместит сам композер и там будут находиться все зависимости, которые мы укажем в ("require": {}) - у нас пока там пусто (зависимости - пакеты, библиотеки, которые мы хотим использовать для нашего проекта) и будет прописано соответствие: ("classes\\": "classes" - Если встретися пространство имен ("classes\\"), то нужно зайти в папку "classes"; еще будет создан файл composer.log, в котором будут перечисленны все пакеты, которые мы установили и т. д. (жмем Enter).

Если композер давно не использовался, то нужно выполнить команду: composer self-update - для обновления.


13-2



- в нашем проекте появилась папка vendor, в которой появился автозагрузчик autoload.php, который нам необходимо подключить в индексном файле, и папка композера.


Файл autoload.php:


-- autoload.php --

// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit31abe0873880c25122af514ee66c6aaf::getLoader();




Подключаем файл autoload.php в индексном файле. От текущей папки __DIR__ нас интересует autoload.php:


- require_once __DIR__ . '/vendor/autoload.php';


При этом закомментируем наш автозагрузчик (function autoloder1($class)).


Файл index.php:


-- index.php --

<?php
use classes\{BookProduct, NotebookProduct};
use classes\interfaces\{IGadget, I3D};

// закомментируем подключение PHPmailer.php
// require_once 'phpmailer/src/PHPmailer.php';

error_reporting(-1);

// подключаем автозагрузчик композера (файл autoload.php)
// от текущей папки __DIR__ нас интересует autoload.php
require_once __DIR__ . '/vendor/autoload.php';

// закомментируем автозагрузчик (function autoloder1($class))

//------------------------------------------------------------------------------

function debug($data)
{
echo '<pre>' . print_r($data, 1 ) . '</pre>';
}

function offerCase($product)
{
echo "<p>Предлагаем чехол для гаджета {$product -> getName()} </p>" ;
}

$book = new BookProduct('Три мушкетера', 20, 1000);

$notebook = new NotebookProduct('Dell', 1000, 'Intel');

offerCase($notebook);

debug($book);

?>




- после перезагрузки страницы у нас все работает.

В папке composer есть автозагрузчик autoload_psr4.php, который использует стандарт автозагрузки PSR-4:


Файл autoload_psr4.php:


-- файл autoload_psr4.php --

<?php
// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
'classes\\' => array($baseDir . '/classes'),
);
?>





Отделение ядра приложения от пользовательских классов




Отделим ядро нашего приложения от пользовательских классов:


- в папке vendor создадим ядро (папка core) и перенесем туда папку с интерфейсами и файл Product.php и будем считать что это наше ядро (для примера).


- переменуем папку classes в папку app - и будем считать, что это наше приложение;


- в файле composer.json переименуем:

- "classes\\": "classes" на - "core\\": "vendor/core",

- и дописываем еще одно правило:

- "app\\": "app";


- в интерфейсах меняем:

- namespace classes\interfaces на - namespace core\interfaces,


- и в файле Product.php меняем:

- namespace classes на - namespace core;


- в классах приложения (папка app) меняем:

- namespace classes на - namespace app,

- и в юзах (use) меняем:

- use classes\interfaces\I3D на - use core\interfaces\I3D,

- use classes\interfaces\IGadget на - use core\interfaces\IGadget,

- добавляем:

- use core\Product (импортируем данный класс);


- соответствующие замены делаем в файле index.php в юзах (use):

- use app\{BookProduct,NotebookProduct};

- use core\interfaces\{IGadget,I3D} ;


- Далее мы должны пересоздать автозагрузчик, для этого в консоли вызываем список команд командой "composer" и выбираем "dump-autoload" или "dumpautoload" (данные команды сгенерируют новый автозагрузчик, используя файл composer.json). Набираем в консоли команду "composer dump-autoload" и жмем "Enter"



Устанавливаем библиотеку PHPmailer (сторонняя библиотека):
- Заходим в Open Server и открываем консоль
- Заходим в наш проект: cd domains\PHPoop1\13 и жмем "Enter" - переходим в нужную нам папку.
- с сайта phpmailer копируем команду: composer require phpmailer/phpmailer и запускаем ее в консоли;
- в результате установки появляется новый log - файл , в папке vendor появилась библиотека phpmailer,
- в файле autoload_psr4.php - появилась новая запись:

- 'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src')


Установка композера вручную - в примере на ютуб (https://www.youtube.com/watch?time_continue=4&v=FFwtoK8NRps).



В индексном файле создадим объект $mail:

- $mail = new \PHPMailer\PHPMailer\PHPMailer();


и посмотрим, все ли у нас работает:

- debug($mail);



Изменения в файлах:


Файл composer.json:


-- файл composer.json --

{
"require": {
"phpmailer/phpmailer": "^6.0"
},

"autoload": {
"psr-4":{
"core\\": "vendor/core"
"app\\": "app"
}
}
}




Интерфейс IGadget.php:


-- интерфейс IGadget --

<?php
namespace core\interfaces;

interface IGadget
{
// публичный метод getCase() без реализации
public function getCase();
}
?>




Интерфейс I3D.php:


-- интерфейс I3D.php --

<?php
namespace core\interfaces;

interface I3D
{
// константа интерфейса
const TEST2 = 'test interface';
// метод интерфейса (данный метод не имеет реализацию)
public function test();
}
?>




Файл Product.php:


-- файл Product.php --

<?php
namespace core;

abstract class Product
{
//...
//...
//...
}
?>




файл BookProduct.php:


-- файл BookProduct.php --

<?php
namespace app;

use core\interfaces\I3D; // импортируем I3D
use core\Product; // импортируем данный класс

class BookProduct extends Product implements I3D
{
//...
//...
//...
}
?>




файл NotebookProduct.php:


-- файл NotebookProduct.php --

<?php
namespace app;

use core\interfaces\IGadget; // импортируем IGadget
use core\Product; // импортируем данный класс

class NotebookProduct extends Product implements IGadget
{
//...
//...
//...
}
?>




Файл index.php:


-- index.php --

<?php
use app\{BookProduct,NotebookProduct};
use core\interfaces\{IGadget,I3D};

error_reporting(-1);

// подключаем автозагрузчик композера (файл autoload.php)
// от текущей папки __DIR__ нас интересует autoload.php
require_once __DIR__ . '/vendor/autoload.php';

//------------------------------------------------------------------------------

function debug($data)
{
echo '<pre>' . print_r($data, 1 ) . '</pre>';
}

function offerCase($product)
{
echo "<p>Предлагаем чехол для гаджета {$product -> getName()} </p>";
}

$book = new BookProduct('Три мушкетера', 20, 1000);

$notebook = new NotebookProduct('Dell', 1000, 'Intel');

offerCase($notebook);

debug($book);

// создаем объект $mail класса PHPMailer
$mail = new \PHPMailer\PHPMailer\PHPMailer();
debug($mail); // распечатываем этот объект

?>

Получим:
Предлагаем чехол для гаджета Dell
app\BookProduct Object
(
[numPages] => 1000
[name:core\Product:private] => Три мушкетера
[price:protected] => 20
[discount:core\Product:private] => 5
)
PHPMailer\PHPMailer\PHPMailer Object
(
[Priority] =>
...
...
...




В файле autoload_psr4.php - появилась новая запись:


-- файл autoload_psr4.php --

<?php
// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
'core\\' => array($baseDir . '/core'),
'app\\' => array($baseDir . '/app'),

// появилась новая запись
'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src'),
);
?>




Итоговое содержание папки 13 ("Composer и автозагрузка"):


13-3



С использованием автозагрузчика композера мы не подключали вообще ничего. Достаточно было установить пакет библиотеки и можно уже использовать данную библиотеку. Никаких require, никаких собственных автозагрузчиков не нужно - всем этим занимается композер.


Установка композера вручную - в примере на ютуб (youtube.com).






Наверх Наверх