The most significant changes in version 1.3 include the introduction of phase concepts, which allow applications to interweave with each other without interference.
Author QQ: 85811616
Official QQ Group: 714610448
Gitee Repository: https://gitee.com/dvaknheo/duckphp
GitHub Repository: https://github.com/dvaknheo/duckphp
Quick Start Guide, quick start page.
Document Index Page, all documentation pages, entry point for all documents.
cd template
php ./duckphp-project run
composer require dvaknheo/duckphp # use require
./vendor/bin/duckphp new --help # view available commands
./vendor/bin/duckphp new # create project
./vendor/bin/duckphp run # --host=127.0.0.1 --port=9527 # start web server
It is not recommended to use a web server through the command line. You can set up the document root for Nginx or Apache as the public
folder and configure it like any other framework.
DuckPhp also supports usage within subdirectories and works with web servers that do not require configuration for path_info
.
The name DuckPhp comes from:
Duck Typing
, if it walks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
Utinnyi tip
, if something looks like a duck, talks like a duck, then it must be a duck.Начально, это была попытка создать простой PHP веб-фреймворк. Сейчас он имеет простую форму использования, но сложную внутреннюю реализацию.
История версий DuckPhp
Бизнес-слой, обычно Model, Controller, View имеют один уровень ниже. Из-за отсутствия этого уровня, возникают много плохих ситуаций. Вы заметите, что многие люди пишут множество кода в контроллере или модели. Этот слой. Некоторые называют его Service, а некоторые — Logic. Я сначала называл его App, долго использовал название Service. Сейчас же я предпочитаю называть его Business — бизнес-слой. Причина изменения в том, что Business означает "бизнес". Это не требует дополнительных объяснений.Кроме того, сейчас слой Service используется слишком часто. Сервисы от третьих сторон действительно можно назвать Service, но то, что находится внутри бизнес-процесса, лучше всего называть Business. Service воспринимается как служба, необходимая для выполнения бизнес-функций, которая сама по себе не может завершить конкретную задачу. Поэтому Business слой ориентирован на бизнес-логику, Model слой ориентирован на схему базы данных, Controller слой ориентирован на URL-адреса, а View слой ориентирован на представление — это идеология DuckPhp.Основное значение DuckPhp заключается в его концепции. Как только эта идея внедрена, вы можете использовать любой другой фреймворк. Вы можете реализовать архитектуру контроллер-бизнес-модель без использования DuckPhp. Главное — наличие этой идеи.
DuckPhp позволяет легко интегрировать ваш проект в другие проекты без необходимости модификаций. Вам не требуется выполнять повторное развитие над DuckPhp.
DuckPhp не ограничивает пространство имён вашего проекта значением "app".
DuckPhp легко интегрируется с другими PHP фреймворками. По результатам выполнения DuckPhp можно определить, следует ли продолжать работу других фреймворков.
DuckPhp поддерживает расширение. Эти расширения могут существовать независимо от DuckPhp.
Как современная PHP библиотека, полная заменяемость компонентов является необходимым условием.
DuckPhp использует изменяемый Singleton подход, что решает проблему "неизменной формы вызова системы, но изменяемой формы реализации". Это позволяет исправлять системные уязвимости без необходимости изменения кода. В отличие от этого, другие фреймворки используют более сложные и менее удобные для отладки IoC и DI технологии.
Если вы недовольны стандартной реализацией, вы также можете легко заменить её на версию, требующую сторонние зависимости.
Например, классы DuckPhp для работы с базами данных очень просты, и их легко заменить.
DuckPhp имеет слабую связанность, что обеспечивает гибкое расширение и легкость модификации.
DuckPhp может сделать так, чтобы ваш проект был связан с кодом DuckPhp всего одной строчкой. Это то, чего другие PHP фреймворки пока не достигли. Ваш код бизнес-процесса практически не зависит от кода DuckPhp. Вам достаточно изучать бизнес-логику, а не сам фреймворк.
Переключение DuckPhp контроллеров происходит легко, они являются независимыми и простыми.
Маршрутизация DuckPhp также может использоваться самостоятельно.
DuckPhp включается как библиотека, поэтому основная структура проекта DuckPhp не содержит большого количества ненужных файлов.
Принцип дизайна DuckPhp: обязательно ли это должно быть частью фреймворка? Можно ли обойтись без него?
Настройки DuckPhp обычно используются по умолчанию. Больше нет необходимости иметь множество конфигурационных файлов.Код DuckPhp прост и не выполняет лишних действий. В демо последней версии (v1.2.13-dev) количество исполняемых строк кода составляет 376 из общего количества 4381. Применение отладки в DuckPhp очень удобна, стек вызова чёткий, что позволяет легко выявить проблемы с помощью debug_print_backtrace(2)
. В случае с фреймворками, использующими middleware, стек вызова становится запутанным.
Компоненты DuckPhp не имеют прямых ссылок друг на друга, поэтому можно использовать var_dump()
для анализа.
DuckPhp/Core/App
является подфреймворком DuckPhp. Иногда использование DuckPhp/Core/App
также возможно, как Lumen относительно Laravel.
DuckPhp поддерживает маршрутизацию всего сайта, а также локальные пути маршрутизации и маршрутизацию без PATH_INFO. Это позволяет использовать его без необходимости конфигурации сервера (например, установки PATH_INFO). Можно использовать DuckPhp в подкаталогах без изменения настроек веб-сервера.
DuckPhp совместим с Composer. Он может работать даже без среды Composer. DuckPhp — это библиотека Composer, которая не требует отдельной системы сборки проектов.
DuckPhp следует принципу минимального удивления, стараясь избегать распространённых проблем:
"Откуда взялось это? Как оно здесь появилось? Чем это может помочь? Я могу удалить его?"Избегаются внезапно появляющиеся элементы, такие как аннотации.
Поскольку автор DuckPhp страдает от навязчивого расстройства, каждый выпуск проходит через полное покрытие тестами, что обеспечивает высокую надёжность.
Роль пользователя DuckPhp делится между "ビジネским инженером" и "ядерным инженером".
"Бизнес-инженер" должен заниматься только бизнес-кодом.
"Ядерный инженер" должен заниматься системой ядра.
DuckPhp не вторгается в пространство других приложений, что исключает конфликты глобальных функций.
Структура проекта DuckPhp четко разделена, без кросс-ссылок.
Классы DuckPhp стараются быть бессостоятельными.
Есть ещё много других преимуществ, которые становятся очевидными при использовании.
DuckPhp имеет возможность расширения, чтобы запрещать напрямую записывать SQL в контроллерах. Иногда, фреймворк должен пожертвовать производительностью ради предотвращения ошибок. Однако это почти не влияет на производительность DuckPhp.
DuckPhp использует расширение WorkermanHttpd для поддержки Workerman. Нет необходимости менять исходный код проекта, и в будущем будет поддерживать больше платформ.
/-> View
Controller --> Business ---------------> Model
\ \ \ / \
\ \ \--> Service --------> ModelEx --> ModelHelper
\ \ \
\ ---------------->(Business)Helper
\-->(Controller)Helper
Если между Business-компонентами происходит взаимное обращение, что делать? Добавьте компоненты с суффиксом Service для внутреннего использования Business, но не предназначенные для внешнего доступа, например, CacheService.
Как быть при работе с несколькими таблицами? Три возможных решения:
Директория template в коде DuckPhp служит примером структуры проектной директории и является эталонной реализацией.При выполнении команды ./vendor/bin/duckphp new
, код будет скопирован в проектную директорию и произведены необходимые изменения.
@script структура директорий```text . ├── конфиг │ ├── DuckPhpApps.config.php │ └── DuckPhpSettings.config.php ├── duckphp-project ├── публичная директория │ └── index.php ├── временная директория │ └── keepme.txt ├── исходные файлы │ ├── бизнес логика │ │ ├── базовый файл.php │ │ ├── бизнес исключение.php │ │ ├── общая служба.php │ │ ├── демо бизнес.php │ │ └── помощник.php │ ├── контроллер │ │ ├── базовый файл.php │ │ ├── общее действие.php │ │ ├── контроллер исключение.php │ │ ├── отчет об ошибке.php │ │ ├── помощник.php │ │ ├── основной контроллер.php │ │ ├── сессия.php │ │ ├── тестовый контроллер.php │ │ └── тестовый контроллер.php │ ├── модель │ │ ├── базовый файл.php │ │ ├── исключение между моделями.php │ │ ├── демо модель.php │ │ └── помощник.php │ └── система │ ├── приложение.php │ ├── помощник.php │ ├── опции.php │ └── проектное исключение.php └── представление ├── системные файлы │ ├── 404 ошибка.php │ └── 500 ошибка.php ├── файлы.php ├── главное представление.php └── тест └── завершение.php
Этот шаблон директорий представляет собой структуру проекта для крупных систем. Для небольших проектов его можно ещё сократить.В этой структуре директорий **business engineer** может работать только в следующих четырёх директориях: `src/Controller`, `src/Model`, `src/Business`, `view`.
Остальные директории предназначены для работы **core engineer**.
Директория `src` содержит все элементы пространства имен `ProjectTemplate`.
Пространство имен `ProjectTemplate` является настраиваемым. Например, его можно изменить на `MyProject`, `TheBigOneProject` и так далее. Это можно сделать командой `./vendor/bin/duckphp new --namespace TheBigOneProject`.
Файлы довольно просты — это пустые классы или классы с пустыми наследованиями, что позволяет легко адаптироваться к различным требованиям. Можно ли упростить эти структуры? Да, вы можете вообще отказаться от использования директорий.
Класс `App.php` в директории `System` наследует класс `DuckPhp\DuckPhp`. Этот файл служит входной точкой для всего приложения, и именно здесь происходит основной процесс запуска. Этот класс особенно важен для понимания **core engineer**.
Базовый класс каждого каталога — это то, что вам следует изменять. Они обычно реализуют только паттерн Singleton.
### Как упростить структуру директорий
* Удалите директорию `config/`.
* Удалите директорию `view/_sys/`. Вам потребуется настроить опции запуска для ошибок 404 и 500 (`'error_404'`, `'error_500'`).
* Удалите директорию `view`, если она вам не нужна, например, в случае API-проекта.
* Удалите `duckphp-project`, если вам не нужны дополнительные команды командной строки.
* Удалите тестовые и демонстрационные файлы.@[script] Директория структуры
## Восьмое. Индекс руководств
Руководство по работе с помощниками находится здесь [руководство по помощникам](docs/tutorial-helper.md). После прочтения этого руководства **business engineer** сможет приступить к работе.
Если у вас есть вопросы, обратитесь к **core engineer**.
После завершения быстрого руководства, возможно, вам также придется ознакомиться с [общими руководствами](docs/tutorial-general.md).
Например, часто используется маршрутизация по файлам. [Маршрутизация](docs/tutorial-route.md).
Если ваш проект использует встроенную базу данных, вам также стоит ознакомиться с [руководством по базе данных](docs/tutorial-db.md).
Также рекомендовано ознакомление с [руководством по обработке исключений](docs/tutorial-exception.md) и [руководством по обработке событий](docs/tutorial-event.md).
Для управления командной строкой вам потребуется ознакомиться с [руководством по управлению командной строкой](docs/tutorial-console.md).
Дополнительные возможности требуют ознакомления с [введением в расширения](docs/tutorial-extension.md).
И, наконец, просмотрите [раздел по развитию](docs/tutorial-support.md) для участия в разработке.
## Девятое. Примеры
### 1. Hello World
@[script] Файл: `template/public/helloworld.php`
```php
<?php declare(strict_types=1);
/**
* DuckPhp
* Отныне ты никогда не будешь одиноко...
*/
require_once(__DIR__ . '/../../autoload.php'); // @DUCKPHP_HEADFILE
```
## Пример использованияПример ниже демонстрирует базовое использование класса `MainController`.
```php
class MainController
{
public function action_index()
{
echo "Привет, мир!";
}
}
```
### Настройка опций
Для настройки поведения приложения используются различные опции, такие как:
```php
$options = [
'namespace_controller' => "\\",
// В данном примере спецификация указывает, что пространство имён контроллера находится в корне, а не по умолчанию в Controller.
];
```
### Запуск приложения
Приложение запускается с помощью метода `RunQuickly`, который принимает массив опций.
```php
\DuckPhp\Core\App::RunQuickly($options);
```
---
### Подробный пример
#### Описание
Файл шаблона `template/public/demo.php` демонстрирует использование `DuckPhp`. Этот пример предназначен для демонстрации возможностей, поэтому все компоненты собраны в одном файле. В реальном проекте каждый компонент будет находиться в отдельном файле.
#### Код
```php
<?php declare(strict_types=1);
/**
* DuckPHP
* Отныне вы никогда не будете одиноки~
*/
namespace MySpace\System
{
require_once(__DIR__ . '/../../autoload.php'); // @DUCKPHP_HEADFILE
use DuckPhp\Component\RouteHookPathInfoCompat;
use DuckPhp\DuckPhp;
use DuckPhp\Ext\CallableView;
use MySpace\View\Views;
``` class App extends DuckPhp
{
public $options = [
'is_debug' => true,
// Включение режима отладки
'path_info_compact_enable' => true,
// Включение режима одного файла, чтобы приложение могло работать без дополнительной конфигурации сервера
'ext' => [
CallableView::class => true,
// По умолчанию View не поддерживает вызов функций, поэтому мы активируем расширение CallableView вместо системного View
],
'callable_view_class' => Views::class,
// Замена класса View.
];
}```markdown
namespace MySpace\Controller
{
use DuckPhp\Foundation\Controller\Helper;
use DuckPhp\Foundation\SimpleControllerTrait;
use MySpace\Business\MyBusiness;
class MainController
{
use SimpleControllerTrait;
public function __construct()
{
// Установите шапку и футер в конструкторе.
Helper::setViewHeadFoot('header', 'footer');
}
public function action_index()
{
// Получение данных
$output = "Привет, текущее время - " . __h(MyBusiness::_()->getTimeDesc()); // html-кодировка
$url_about = __url('about/me'); // url-кодировка
Helper::Show(get_defined_vars(), 'main_view'); // Отображение данных
}
}
class AboutController
{
public function action_me()
{
$url_main = __url(''); // По умолчанию используется этот URL
Helper::setViewHeadFoot('header', 'footer');
Helper::Show(get_defined_vars()); // По умолчанию используется представление about/me, можно опустить
}
}
}
} // Конец пространства имён
namespace MySpace\Business
{
use MySpace\Model\MyModel;
use DuckPhp\Foundation\Business\Helper;
use DuckPhp\Foundation\SimpleBusinessTrait; // Для использования Business::_() как переменной одного экземпляра.
}
``` class MyBusiness
{
use SimpleBusinessTrait;
public function getTimeDesc()
{
return "<" . MyModel::getTimeDesc() . ">";
}
}
} // Конец пространства имён
namespace MySpace\Model
{
//use DuckPhp\Foundation\Model\Helper;
use DuckPhp\Foundation\SimpleModelTrait;
class MyModel
{
use SimpleModelTrait;
public static function getTimeDesc()
{
return date(DATE_ATOM);
}
}
}
// Теперь уберём PHP-код, чтобы получить HTML-структуру для просмотра
namespace MySpace\View {
class Views
{
public static function header($data)
{
extract($data); ?>
<html>
<head>
</head>
<body>
<header style="border:1px gray solid;">Я шапка</header>
<?php
}
</class>
<?php
public static function main_view($data)
{
extract($data); ?>
<h1><?= $output ?></h1>
<a href="<?= $url_about ?>">Перейти к "о_мне"</a>
<?php
}
public static function about_me($data)
{
extract($data); ?>
<h1>Хорошо, вернитесь назад.</h1>
<a href="<?= $url_main ?>">Вернуться обратно</a>
<?php
}
public static function footer($data)
{
?>
<footer style="border:1px gray solid;">Я нижняя часть страницы</footer>
</body>
</html>
<?php
}
}
} // конец пространства имён
```
# Входной скрипт
```php
//------------------------------
// Входной скрипт, расположенный в конце для избежания проблем автоматической загрузки
```namespace
{
$options = [
// 'override_class' => 'MySpace\System\App',
// Вы также можете здесь настроить опции. Опции внутри заменённого класса
];
\MySpace\System\App::RunQuickly($options);
}
```## Десять. Конфигурация Nginx
Это моя конфигурация 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
(Жирным шрифтом выделены файлы, используемые при запуске системы)
## Двенадцать. Что ещё нужно сделать DuckPhp?
**Очень нужна ваша обратная связь!**
* Документация. Сейчас уже есть много документов, но они всё ещё недостаточны и требуют доработки.
* Примеры. Примеров пока слишком мало и они слишком просты.
* Более мощные примеры использования.
## Тринадцать. Ещё что сказать?
Используйте его, поддержите меня, это мотивирует меня продолжать работу над проектом.

```
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )