четверг, 23 марта 2023 г.

PHP, ООП, автозагрузка классов (файлы классов в разных каталогов)

При разработке web-приложения на языке PHP с применением средств объектно-ориентированного программирования (ООП), удобно использовать автоматическую загрузку классов, особенно когда классов много, чтобы не использовать require_once или include для каждого файла, содержащего определенным класс.

Идея основана на применении функции Standart PHP Library - spl_autoload_register().
При создании класса: $class = new Class1(), если класс не найден, то вызывается функция spl_autoload_register().

Каждый класс хранится в отдельном файле.

Файл: /test/Framework/Autoloader.php
class Autoloader
{
    // Список каталогов, в которых расположены классы
    public static $dir_list = array('Framework/Core/', 'Framework/UI/');

    public static function register()
    {
        ini_set('unserialize_callback_func', 'spl_autoload_call');
        spl_autoload_register(array(new self, 'autoload'));
    }

    private static function autoload($class)
    {
        foreach (self::$dir_list as $dir)
        {
            $file = trim($dir, '/').'/'.$class.'.php';
            if (is_file($file))
            {
                require_once($file);
            }
        }
    }
}

Файл: /test/index.php
<?php
    required_once('Framework/Autoloader.php');

    // в случае если каталог поиска файлов классов надо установить свой
    // Autoloader::$dir_list = array('Framework/UI');

     Autoloader::register();

    $core = new Core();
    $menu = new Menu();
?>

Autoloader::$dir_list = позволяет определить массив строк, определяющих каталоги, в которых необходимо искать используемые файлы классов, или если для проекта список каталогов является одним и тем же списком, то этот список каталогов можно прописать прямо в статическую переменную класса Autoload `public static $dir_list = ...` и Autoloader::$dir_list не использовать.

Структура каталогов:
/test
    /Framework
        /Core
            Core.php

        /UI
            Menu.php

    Autoloader.php

index.php

вторник, 7 марта 2023 г.

Debian + php + ssmtp (Отправка почты с VDS или VMWare Player)

1. Обновляем Debian
sudo apt-get updat
sudo apt-get upgrade



2. Устанавливаем ssmtp
sudo apt-get install ssmtp


3. Устанавливаем mailutils (для использования `mail` в php-скрипте)
sudo apt-get install mailutils


4. Создаем учётную запись на почтовом сервер Yandex, например, user@yandex.ru с паролем user_111.

4.1. Заходим в настройки Яндекс.Почты созданного профиля и разрешаем "Все настройки" -> "Почтовые программы" и разрешаем доступ к почтовому ящику с помощью почтовых клиентов.

4.2. Создаем отдельный пароль для приложения, чтобы не сообщать сторонним сервисам ваш общий пароль на Яндексе (не помню где именно эта ссылка, можно найти через yandex.ru).


5. Добавляем к концу файл /etc/ssmtp/revaliases (используется для отправки письма с командной строки от имени учётной записи `root` и от исполнительного имени web-службы `www-data`)
root:user@yandex.ru:smtp.yandex.ru:465
www-data:user@yandex.ru:smtp.yandex.ru:465


6. Добавляем в файл /etc/ssmtp/ssmtp.conf настройки подключения к почтовому ящику:
mailhub=smtp.yandex.ru:465
AuthUser=user@yandex.ru
AuthPass=[Пароль из шага 4.2]
rewriteDomain=[hostnmae or domain-name]
hostname=[hostname or domain-name]
UseTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
root=user@yandex.ru


Проверка через командную строку:
root@palem:~# echo "Test message!" | ssmtp user@yandex.ru


Проверка через php-скрипт:
<?php
    $to      = 'UserOld@list.ru';
    $subject = 'Test Email';
    $message = 'Hello Igor';
    $headers = 'From: Support Team <user@yandex.ru>' . "\r\n" .
        'Reply-To: support@server.com' . "\r\n" .
        'MIME-Version: 1.0' . "\r\n" .
        'Content-Type: text/html; charset=utf-8' . "\r\n" .
        'Content-Transfer-Encoding: quoted-printable';

    print mail($to, $subject, $message, $headers);
?>

Docker. Первые контейнеры

Источник:  php.dragomano.ru Структура каталогов: ~/develop/web/project/                  nginx/      - сервис web-сервера                php...