Создание сайта с помощью фреймворка HLEB. Часть 10. Обещанная консольная команда

19 Сентября 2022 (ред)

(!) Примеры и описание для более новой версии фреймворка HLEB2 могут отличаться от приведенных в тексте.

Последней в этом цикле статей по созданию демонстрационного сайта на PHP фреймворке HLEB, будет тема о создании собственной консольной команды, о которой упоминалось в самом начале, в части 1

Создание консольной команды

Автоматизация повторяющихся действий (в том числе создание собственных консольных команд) значительно улучшает жизнь разработчика.

Для начала просмотрим системные команды фреймворка (выполняется из корневой директории проекта).

$ php console --help

В текущей версии фреймворка их список таков:

 --version or -v  (версия фреймворка)
--clear-cache or -cc  (очистка кэша шаблонов и маршрутов)
--forced-cc (принудительная очистка кэша)
--clear-routes-cache or -routes-cc (очистка кэша маршрутов)
--info or -i (displays the values of the main settings) (вывод настроек)
--help or -h (отображение стандартных консольных команд)
--routes or -r (список маршрутов)
--list or -l  (вывод списка пользовательских команд)
        --list <command> [--help] (информация о команде)
--logs or -lg  (отображение последних ошибок в логах)
--find-route <url> [method] [domain] (поиск маршрута по url)
--new-task (создание новой команды)
        --new-task example-task "Short description" (шаблон создания новой команды)

Теперь другой командой посмотрим пользовательские, добавленные в папку /app/Commands

$ php console --list

Она выведет в терминал:

TASK                         COMMAND                         DESCRIPTION

Hlogin\CreateLoginTableTask  hlogin/create-login-table-task  Create tables for login
RotateLogsTask               rotate-logs-task                Delete old logs

Здесь находится как команда для ротации логов, так и команда на создание администратора, прежде добавленная при установке библиотеки регистрации HLOGIN.

Теперь добавим собственную консольную команду. Она будет выполнять одно действие - обнулять все лайки пользователей и начинать рейтинг с начала.

<?php

/* Файл /app/Commands/DeleteAllLikesTask.php */

namespace App\Commands;

use App\Models\LikeModel;

class DeleteAllLikesTask extends \Hleb\Scheme\App\Commands\MainTask
{
    /** php console delete-all-likes-task **/

    const DESCRIPTION = "Clearing the table with likes";

    /** Обнуляет все лайки, очищая таблицу с ними */
    protected function execute() {

        LikeModel::deleteAll();

        echo "Likes table has been cleared!";

        echo PHP_EOL . __CLASS__ . " done." . PHP_EOL;
    }

}

Теперь снова посмотрим список пользовательских команд:

$ php console --list
TASK                         COMMAND                         DESCRIPTION

DeleteAllLikesTask           delete-all-likes-task            Clearing the table with likes
Hlogin\CreateLoginTableTask  hlogin/create-login-table-task   Create tables for login
RotateLogsTask               rotate-logs-task                 Delete old logs

В перечне новая команда delete-all-likes-task (составлена из названия класса). Если её выполнить, то данные в таблице 'likes' будут очищены.

$ php console delete-all-likes-task 

Поздравляю, собственная консольная команда добавлена!

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

На этом закончен список примеров и рекомендаций "Создание сайта с помощью фреймворка HLEB", если у вас появились вопросы, пишите в комментарии к соответствующей теме или в группу техподдержки в Telegram @phphleb

Скачать все файлы урока в ZIP-архиве

Предыдущая статья

В начало

fomiash fomiash + 215
Опубликовано в PHP фреймворк HLEB

7 Ответов

  1. YuraN YuraN 06 Декабря 2022 (ред.)

    Поставил на open server - почему то появляется каптча... и авторизация не происходит... просто небольшая пауза и окно авторизации продолжает висеть.

    Также установил на обычный хостинг... На обычном хостинге капча не появляется. Не работает консольная команда обнуления лайков...жалуется на отсутствие главного класса...

    php console delete-all-likes-task
    PHP Fatal error:  Uncaught Error: Class "MainModel" not found in /my_path/adzr.ru/app/Models/LikeModel.php:13
    Stack trace:
    #0 /my_path/adzr.ru/vendor/phphleb/framework/Main/MainAutoloader.php(117): include_once()
    #1 /my_path/adzr.ru/vendor/phphleb/framework/Main/MainAutoloader.php(59): Hleb\Main\MainAutoloader::init('/my_path/...')
    #2 /my_path/adzr.ru/vendor/phphleb/framework/autoloader.php(41): Hleb\Main\MainAutoloader::get('app/Models/Like...')
    #3 /my_path/adzr.ru/app/Commands/DeleteAllLikesTask.php(18): hl_main_autoloader('App\\Models\\Like...')
    #4 /my_path/adzr.ru/vendor/phphleb/framework/Scheme/App/Commands/MainTask.php(28): App\Commands\DeleteAllLikesTask->execute()
    #5 /my_path/adzr.ru/vendor/phphleb/framework/Main/Console/MainConsole.php(445): Hleb\Scheme\App\Commands\MainTask->createTask(Array)
    #6 /my_path/adzr.ru/vendor/phphleb/framework/console.php(201): Hleb\Main\Console\MainConsole->createUsersTask('/my_path/...'  , 'DeleteAllLikesT...')
    #7 /my_path/adzr.ru/console(17): require('/my_path/...')
    #8 {main}
      thrown in /my_path/adzr.ru/app/Models/LikeModel.php on line 13

    На локальном не получается ни зарегистрироваться ни авторизоваться админом, команда php console delete-all-likes-task никаких ошибок не выдает... Почему получилось так с капчей? Вроде устанавливал все одинаково... И где ее можно отключить?

  1. fomiash fomiash 06 Декабря 2022

    Разница действительно ощутимая, возможно, есть различия в файлах.

    Если вы использовали архив с итоговыми файлами по ссылке под статьёй, то капча там отключена по умолчанию. Также там можно ставить лайки не подтверждая E-mail (аналогично условиям из этого курса по созданию API). Настройка капчи в конфигурации (поле active):

    {
        "ucaptcha": {
            "version": "1",
            "data": {
                "active": "off",
                "design": "base"
            }
        }
    }
    

    Сравните на окружениях файл /storage/lib/ucaptcha/config.json.

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

    <?php
    namespace App\Models;
    class LikeModel extends \Hleb\Scheme\App\Models\MainModel
    {
       // ...
    }
    

    Обновил в прилагаемом выше к посту архиве.

  1. fomiash fomiash 07 Декабря 2022

    Для Open Server нужно удостовериться, что закомментировано следующее(или отсутствует) в файле /public/.htaccess

    <IfModule mod_headers.c>
       # Header onsuccess edit Set-Cookie ^(.*) "$1; SameSite=Strict; HttpOnly; Secure"
    </IfModule>
    
    
  1. fomiash fomiash 07 Декабря 2022 (ред.)

    Если нужно подтвердить E-mail локально, в этом случае поможет то, что "отправленные" письма сохраняются в лог (/storage/logs/). В письме нужно найти ссылку после слов Для подтверждения адреса E-mail необходимо пройти по и вставить в браузер. Второй способ - изменить в базе данных пользователю значение regtype на 2.

    Сохранение писем в логи (а также капча и другое) настраивается в админпанели при входе под администратором.

  1. fomiash fomiash 07 Декабря 2022 (ред.)

    В случае запуска с одной базой данных, но разными установками фреймворка, может быть такое, что уникальные ключи каждой установки (если это два разных проекта по разным папкам) различаются. Это сделано для безопасности и для их синхронизации (чтобы шифрованные пароли пользователей подходили на этих установках) нужно из той папки, где вы регистрировали администратора, скопировать секретный ключ /storage/cache/key/security-key.txt в другие установки. Если база данных от старого проекта на основе фреймворка HLEB, а установка его новая, соответственно ключ не подходит, можно просто восстановить пароль как пользователям, так и администратору.

  1. YuraN YuraN 07 Декабря 2022

    Спасибо огромное за подробные ответы. С капчей разобрался, да в конфиге на локальном было значение "active": "on", поменял на "off", также в .htaccess закомментировал эту строку Header onsuccess edit Set-Cookie ^(.*) "$1; SameSite=Strict; HttpOnly; Secure". Однако авторизоваться удалось только после смены версии php c 8.1 на 7.4 в модулях open server, хотя на хостинге тоже стоит 8.1 и там с авторизацией нет проблем. Возможно есть какие то нюансы с работой под windows, а может я поставил локально криво... Также заменил class LikeModel extends \MainModel на class LikeModel extends \Hleb\Scheme\App\Models\MainModel в файле LikeModel.php - обнуление лайков с консольной команды отработало четко.

  1. fomiash fomiash 08 Декабря 2022 (ред.)

    @YuraN, озадачившись вопросом переустановил Open Server 5.4.3 (на Windows 10), выбрал PHP 8.1, MySQL 8.0, направил домен в папку public проекта (тот, что под этим постом по ссылке на архив),

    создал базу test и внёс настройки:

    define ("HLEB_TYPE_DB", "mysql.example");
    
    define("HLEB_PARAMETERS_FOR_DB", [
    
        "mysql.example" => [
            "mysql:host=localhost",
            "port=3306",
            "dbname=test",
            "charset=utf8",
            "user" => "root",
            "pass" => "",
        ]
    ]);
    

    Выполнил команду php console hlogin/create-login-table-task в корне проекта, чтобы сгенерировать нового администратора. Под ним захожу свободно, лайки ставятся, пользователи добавляются. Так что воспроизвести проблему не удалось.



Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.