[toc]
Используемые роли в DuckPhp разделены на две категории: "Бизнес-инженеры" и "Ядро-инженеры".
"Бизнес-инженеры" отвечают за повседневные операции CRUD. В качестве "Бизнес-инженера", вы не должны использовать ничего из пространства имён DuckPhp, как будто бы это пространство имён не существует.
"Ядро-инженеры" исследуют внутренние классы DuckPhp и пишут общую базовую реализацию.
Это моя конфигурация 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 вместо помощников.### Как упростить структуру каталогов
С учётом вышеописанной структуры файлов, ваш проект должен иметь следующую архитектуру:
Текстовая версия:
/-> 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_DELETE удаление после импорта шаблона
Термины "опции", "настройки" и "конфигурация" различаются следующим образом:
$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();
, а в Ext
— App::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 )