1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dvaknheo-duckphp

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
tutorial-general.md 29 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 13.03.2025 12:05 5f7b14b

Общие шаги

[toc]

Роль разработчика

Используемые роли в DuckPhp разделены на две категории: "Бизнес-инженеры" и "Ядро-инженеры".

"Бизнес-инженеры" отвечают за повседневные операции CRUD. В качестве "Бизнес-инженера", вы не должны использовать ничего из пространства имён DuckPhp, как будто бы это пространство имён не существует.

"Ядро-инженеры" исследуют внутренние классы DuckPhp и пишут общую базовую реализацию.

Конфигурация Nginx

Это моя конфигурация Nginx. Если вы столкнулись с проблемами при установке, пожалуйста, отправьте мне обратную связь. Конечно, после того как конфигурация установлена, её обычно не меняют. Любые проблемы установки могут быть проигнорированы.

server {
    root DUCKPHP_ROOT/template/public;
    index index.php index.html index.htm;

    try_files $uri $uri/ /index.php$request_uri;
    location ~ \.php {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.*\.php)(/.*)?$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Структура каталогов

Шаблон директорий внутри кода DuckPhp является примером нашей проектной структуры. Это также служебный код проекта.При выполнении команды ./vendor/bin/duckphp new, код будет скопирован в проектную директорию и будут сделаны некоторые изменения. @script структура директорийtext +-- cli.php // Входной файл для командной строки +-- config // Директория конфигурационных файлов | +-- DuckPhpApps.config.php // Конфигурационный файл системы | +-- DuckPhpSettings.config.php // Файл настроек +-- runtime // Директория с записываемыми данными | \-- keepme.txt // Заполнитель, используемый для git +-- src // | +-- Business // | | +-- Base.php // | | +-- BusinessException.php // | | +-- CommonService.php // | | +-- DemoBusiness.php // | | \-- Helper.php // | +-- Controller // | | +-- Base.php // | | +-- Commands.php // | | +-- CommonAction.php // | | +-- ControllerException.php // | | +-- ExceptionReporter.php // | | +-- Helper.php // | | +-- MainController.php // | | +-- Session.php // | | \-- testController.php // | +-- Model // | | +-- Base.php // | | +-- CrossModelEx.php // | | +-- DemoModel.php // | | \-- Helper.php // | \-- System // | +-- App.php // | +-- AppWithAllOptions.php // | \-- ProjectException.php // \-- view // +-- _sys // | +-- error_404.php // | \-- error_500.php // +-- files.php // +-- main.php // \-- test // \-- done.php // Этот структурный каталог позволяет "business process engineers" писать только в следующие четыре директории: src/Controller, src/Model, src/Business, view. Все остальные директории предназначены для работы "ядерных инженеров". Имя пространства имен LazyToChange можно изменять. Например, его можно установить как MyProject, TheBigOneProject и так далее. Для изменения можно использовать команду . /vendor/bin/duckphp new --namespace TheBigOneProject.Файлы не сложные. Большинство из них — пустые классы или пустые классы наследования, что делает их удобными для различных обработок. Можно ли упростить эти структуры? Да, вы можете вообще отказаться от создания директорий.

Класс в файле System/App.php является входным классом, который наследует класс DuckPhp\DuckPhp. Здесь происходит основной процесс работы приложения; этот класс является ключевым для понимания работы проекта.

Базовый контроллер BaseController, базовая модель BaseModel и базовое бизнес-логическое окружение BaseBusiness — это те базовые классы, которые вам следует изменить; они реализуют синглетон.

Папка Helper содержит помощники; если вы ленивы, то можете просто использовать класс APP вместо помощников.### Как упростить структуру каталогов

  • Удалите папку app/Helper/, если вы используете методы App::* вместо помощников.
  • Удалите файл app/System/BaseController.php, если ваш контроллер не требует базового класса.
  • Удалите файл app/System/BaseModel.php, если ваша модель использует только статические методы.
  • Удалите файл app/System/BaseBusiness.php, если ваше бизнес-окружение не требует метода G() для синглетона.
  • Удалите папку duckphp-project, если вы используете внешний HTTP сервер.
  • Удалите папку config/, если вы добавите опцию 'skip_setting_file' => true в ваши запуск параметры и не будете использовать конфигурационный файл setting.php.
  • Удалите папку view/_sys, если вы настроите опции запуска 'error_404', 'error_500', 'error_debug'.
  • Удалите папку view, если вы не используете шаблоны представления, например, в случае API-проекта.
  • Удалите файлы TestBusiness.php и TestModel.php, если они используются только для тестирования.## Полная архитектурная схема проекта

С учётом вышеописанной структуры файлов, ваш проект должен иметь следующую архитектуру:

arch_full

Текстовая версия:

           /-> View-->ViewHelper
Controller --> Business -------------------------------------> Model
         \         \   \              \  /
          \         \   \-> (Business)Lib ----> ExModel----------->ModelHelper
           \         \             \
            \         --------------->BusinessHelper
             \-->ControllerHelper

Элементы одного уровня не могут взаимодействовать друг с другом. При создании модели вам могут понадобиться помощники из MyProject\Helper\ModelHelper, используйте псевдоним M для этого класса. При работе с бизнес-логикой вам могут понадобиться помощники из MyProject\Helper\BusinessHelper, используйте псевдоним B для этого класса. При создании контроллера вам могут понадобиться помощники из MyProject\Helper\ControllerHelper, используйте псевдоним C для этого класса. При работе со视图请引入MyProject\Helper\ViewHelper助手类,并将其别名为V。 不应跨层引用辅助类。如果有这样的需求,则说明你的设计存在问题。 对于小型项目可以直接使用入口类MY\Base\App,它包含了上述公共方法。 如果您想偷懒,可以只使用APP类来代替ControllerHelper、ModelHelper、BusinessHelper和ViewHelper。 Business按业务逻辑进行处理,Model按数据库表名称进行处理。 Lib实际上是特殊的Business,用于被其他Business调用。 ExModel是特殊的Model,表示多个表的混合调用。

Индекс руководства

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

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

Также рекомендуется ознакомиться с обработкой ошибок и обработкой событий.

Для работы с командной строкой прочтите руководство по командной строке.

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

Использование сторонних плагинов или преобразование вашего проекта в плагин требуют ознакомления с плагином режима.

Наконец, просмотрите раздел для разработчиков для участия в разработке.

Входные файлы и опции

Входной файл для веб

Как и во многих других веб-фреймворках, наш проект начинается с файла public/index.php.

@script File: template/public/index.php

<?php declare(strict_types=1);
/**
 * DuckPhp
 * Отныне вы никогда не будете одиноки~
 */
require_once(__DIR__.'/../../autoload.php');    //@DUCKPHP_HEADFILE
//echo "<div>Вы не должны запускать шаблонный файл напрямую, установите его!</div>\n"; //@DUCKPHP_DELETE
//echo "<div>Не рекомендуется запускать шаблонный файл напрямую, лучше использовать режим установки</div>\n";              //@DUCKPHP_DELETE
``````php
<?php declare(strict_types=1);
/**
 * DuckPhp
 * Теперь вы никогда не будете одиноки~
 */
namespace ProjectNameTemplate\System;

use DuckPhp\DuckPhp;
use ProjectNameTemplate\Controller\ExceptionReporter;

class App extends DuckPhp
{
    //@override
    public $options = [
        'path' => __DIR__ . '/../../',
        //'path_info_compact_enable' => false,
]
?>
// Устанавливаем директорию для пространства имён проекта, но настоятельно рекомендуется изменить composer.json и использовать composer для загрузки
if (!class_exists(\ProjectNameTemplate\System\App::class)) {
    \DuckPhp\Core\AutoLoader::RunQuickly([]);
    \DuckPhp\Core\AutoLoader::addPsr4("ProjectNameTemplate\\", 'src');
}

$options = [
    // Здесь можно добавить больше опций
    //'is_debug' => true,
];
\ProjectNameTemplate\System\App::RunQuickly($options);

Передняя часть входного класса занимается обработкой заголовочных файлов.

Здесь используется путь к файлам проекта $path, а также пространство имён проекта $namespace.

Затем выполняется следующий код:

\DuckPhp\DuckPhp::RunQuickly($options);

Функция RunQuickly эквивалентна вызову \DuckPhp\DuckPhp::G()->init($options,function(){})->run();, который выполняет инициализацию согласно переданным опциян и возвращает объект LazyToChange\System\App.

Входной файл проекта

Теперь рассмотрим файл app/System/App.php, где класс LazyToChange\System\App является основным входным классом.

@script File: template/src/System/App.php

<?php declare(strict_types=1);
/**
 * DuckPhp
 * Теперь вы никогда не будете одиноки~
 */
namespace ProjectNameTemplate\System;

use DuckPhp\DuckPhp;
use ProjectNameTemplate\Controller\ExceptionReporter;

class App extends DuckPhp
{
    //@override
    public $options = [
        'path' => __DIR__ . '/../../',
        //'path_info_compact_enable' => false,
    ];
}
?>
``````markdown
        'error_404' => '_sys/error_404',
        'error_500' => '_sys/error_500',
        'exception_for_project'  => ProjectException::class,
        'exception_for_business'  => BusinessException::class,
        'exception_for_controller'  => ControllerException::class,
        'exception_reporter' =>  ExceptionReporter::class,
        //'app' => [],
    ];
    //@override
    public function onPrepare()
    {
        parent::onPrepare();
        // your code here
        // this shows the usage of DbTestApp as a child application
        require_once __DIR__ . '/../../public/dbtest.php';
        $this->options['app']['DbTestApp'] = [
            'controller_url_prefix' => 'db_test/',
        ];
        //*/
    }
    //@override
    protected function onInited()
    {
        parent::onInited();
        // your code here
    }
    /**
     * Пример консольной команды
     */
    public function command_hello()
    {
        // этот пример демонстрирует команду `hello`
        echo "hello " . static::class . "\n";
    }
}

Здесь приведены сокращенные комментарии, которые являются по умолчанию активными и имеют ту же функциональность.

//@override комментарии используются для переопределения методов.

В конструкторе родительского класса мы объединяем множество комментариев для различных выборов.

Далее следует более подробное описание этого кода:

// @DUCKPHP начинающие аннотации

Мы видим аннотации, начальные с // @DUCKPHP в папке шаблонов. После запуска установочных скриптов эти строки будут иметь специальное изменение. // @DUCKPHP_DELETE удаление после импорта шаблона

  • // @DUCKPHP_HEADFILE корректировка заголовков

Опции

Термины "опции", "настройки" и "конфигурация" различаются следующим образом:

  • Опции — содержание, передаваемое входному классу
  • Конфигурация — опциональный файл конфигурации
  • Настройки — файлы настроек конфигурации, содержащие чувствительные данные

$options в index.php и в App.php при инициализации передаются и объединяются в общую открытую свойство $options входного класса. В коде класса App остаются многочисленные комментарии-опции, которые также объединяются в свойства $options. Эти комментарии-опции совпадают по значению с дефолтными значениями. DuckPhp позволяет значительно расширять функционал при изменении конфигураций.

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


См. [часть с описанием конфигураций](ref/index.md) для получения информации обо всех доступных опциях.


### Подробное описание основных конфигураций

Примерные файлы DuckPhp содержат комментарии по умолчанию для конфигураций. Конфигурации, которые не используются по умолчанию, будут здесь объяснены.

`'is_debug'=>false,`

    Устанавливает режим отладки.
`'platform'=>'',`

    Устанавливает платформу разработки. * Настройка файла `platform` заменяет значения `error_*`. Если значение равно null, используется значение по умолчанию; если callable, то вызывается как callback; если string, то вызывается как представление.

`'error_debug'=>'_sys/error-debug',`

    В случае активированного режима отладки, отображаются сообщения об ошибках типа Notice.
`'error_404'=>'_sys/error-404'`

    Страница 404.
`'error_500'=>'_sys/error-500'`

    Страница 500, используемая для всех страниц с ошибками.


## Процесс запроса и жизненный цикл

Как мы переходим от DuckPhp\DuckPhp к LazyToChange\System\App?

Файл index.php выполняет следующее:

```php
DuckPhp\DuckPhp::RunQuickly($options, $callback)

Это эквивалентно:

DuckPhp\DuckPhp::G()->init($options)->run();

Где init() — это этап инициализации, а run() — этап выполнения. $callback выполняется после init().

Этап инициализации Обрабатывает режим плагинов.

Обрабатывает автоматическую загрузку `AutoLoader::G()->init($options, $this)->run()`.
Обрабатывает управление исключениями `ExceptionManager::G()->init($exception_options, $this)->run()`.
Выполняет проверку наличия переопределённых классов `checkOverride()`, если есть, продолжает работу через переопределённый класс (`LazyToChange\System\App`).
Дальше идёт этап `initAfterOverride`.#### Этап initAfterOverride

Адаптация конфигураций `initOptions()`.
Адаптация контекста `initContext()`.
Вызов метода для переопределения `onPrepare()`.
Инициализация базовых компонентов `initDefaultComponents()`.
Инициализация расширений `initExtends()`.
Вызов метода для переопределения `onInit()`.

Этап выполнения

Обработка `beforeRunHandler()` внесённых до запуска.
Подготовка к выполнению.
    `beforeRun()`:
        Перезапуск состояния выполнения и установка его в начальное состояние.
        Привязка маршрутов.
    * `onRun`, который можно переопределить.
    ** Начало обработки маршрута `Route::G()->run()`.
    Если ответ 404, обработка 404 `On404()`.
При возникновении исключения,
    переход в обработку исключений.
Очистка после завершения работы.

Этап очистки

Один шаг: установка состояния выполнения в окончательное состояние.

Переопределение входного класса

Добавление вашего кода в процесс запроса

Свойство options_project объединяется с $this->options. Дополнительные опции проекта можно добавить здесь.

  • Защищённый метод onPrepare() Используется для замены стандартных компонентов и т.д.

  • Защищённый метод onInit() Выполняется после завершения инициализации. Здесь следует добавлять действия, требующиеся после завершения инициализации.

  • Защищённый метод onRun() Выполняется во время выполнения.Основной инженер может переопределить эти три метода, чтобы внедрить различные изменения в свой проект.

Замена стандартной реализации

Вы можете заменить стандартную реализацию в методе onPrepare() следующим образом:

Route::G(MyRoute::G());
View::G(MyView::G());
Configer::G(MyConfiger::G());
RuntimeState::G(MyRuntimeState::G());

Исключения составляют AutoLoader и ExceptionManager, которые запускаются до старта системы плагинов.

Поэтому вам потребуется сделать следующее:

AutoLoader::G()->clear();
AutoLoader::G(MyAutoLoader::G())->init($this->options, $this);

ExceptionManager::G()->clear();
ExceptionManager::G(MyExceptionManager::G())->init($this->options, $this);

Как заменять компоненты.

Для удобства использования в onInit.

  • Почему в Core используются App::Foo();, а в ExtApp::G()::Foo();. Потому что расширения в Core находятся внутри DuckPhp\Core\App.

Расширения в Core обычно не используются отдельно. Если вы расширяете какой-либо класс, лучше всего использовать его через App или помощник MVCSA.

Далее идет урок по маршрутизации, где рассматривается Route::G()->run() подробнее.

Загрузка расширений

Загрузка расширений в DuckPhp осуществляется через массив опций $options['ext']. Расширение отображается как $ext_class => $options.

`$ext_class` — это имя класса расширения. Если класс расширения не найден, то он не будет активирован.
`$ext_class` должен удовлетворять интерфейсу компонента. Он вызывается при инициализации.
`$ext_class->init(array $options,$context=null);` // контекст — это реализация DuckPhp.

Если `$options` равно `false`, то расширение не будет активировано,
если `$options` равно `true`, то текущий глобальный `$options` будут переданы внутрь.
Если `$options` является строкой, то она будет отображаться как ключ глобального `$options`.## Вопросы и ответы
  • Почему класс Helper находится в директории Helper?

    Чтобы работать вместе с cloneHelper.

  • Почему существует однострочный статический метод G()?

    Для удобства доступа к объектам. Вы можете рассматривать ::G() как аналогичный метод-фасад. Приемлемый одиночка является сердцем DuckPhp. Если вы используете сторонние пакеты и недовольны их дефолтной реализацией, вы можете заменить их с помощью приемлемого одиночки.

var_dump(MyClass::G());

с использованием Facades это невозможно сделать.

  • Почему использовать DbManager вместо прямого использования DB? Для выполнения операций с логами.

  • Почему названия заканчиваются на Model и Business? Чтобы слова были уникальными и легче находились в поисках.

  • Почему используется Db вместо DB? Для унификации. Сокращения используют camelCase, а не все заглавные буквы.

  • Различия между Class::Method, Class@Method, Class->Method и ~Class

-> указывает на (new Class)->Method @ указывает на Class::G()->Method :: указывает на Class::Method ~ расширяется до текущего пространства имён

  • Фасады, DuckPhp использует приемлемый одиночку вместо фасадов. Мидлвары, DuckPhp предоставляет простое расширение мидлвар — MyMiddlewareManager, но его использование не рекомендуется.

  • События

См. раздел "События".

Запросы и ответы, DuckPhp не имеет такого понятия, Но в контроллерских помощниках есть много общих действий.Базы данных, базы данных в DuckPhp не такие мощные.

Модели

Виды, принципы работы видов в DuckPhp

Обработка ошибок Логирование Валидация, DuckPhp не имеет встроенной валидации, вам потребуется сторонний класс.

Кэш, DuckPhp использует пустой класс кэша по умолчанию.

Сессии // Используйте App::SESSION()

Cookies // Используйте COOKIE

Множественные языки ___l, __h

Загрузка файлов // Отсутствуют

Командная строка, см. раздел "Командная строка"

Расширения библиотеки, см. руководство

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/dvaknheo-duckphp.git
git@api.gitlife.ru:oschina-mirror/dvaknheo-duckphp.git
oschina-mirror
dvaknheo-duckphp
dvaknheo-duckphp
master