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

OSCHINA-MIRROR/dvaknheo-duckphp

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

DuckPhp

English | 中文 [toc]


Version v1.3.1 improvements

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

I. Tutorial

Quick Start Guide, quick start page.

Document Index Page, all documentation pages, entry point for all documents.

Direct Execution Example

cd template
php ./duckphp-project run

Installation via Composer

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.

II. What is DuckPhp

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

  • 1.0.* серия версий - это предшественники DNMVCS в одном файле
  • 1.1.* серия версий - это предшественники DNMVCS разделённые на несколько файлов
  • 1.2.* серия версий - это переименованный DuckPhp после того, как были внедрены новые идеи, возможно будут большие изменения
  • 1.3.* серия версий - это планируемые стабильные версии после начала широкого использования, будет ответственность за историю.

III. Концепция DuckPhp

Бизнес-слой, обычно Model, Controller, View имеют один уровень ниже. Из-за отсутствия этого уровня, возникают много плохих ситуаций. Вы заметите, что многие люди пишут множество кода в контроллере или модели. Этот слой. Некоторые называют его Service, а некоторые — Logic. Я сначала называл его App, долго использовал название Service. Сейчас же я предпочитаю называть его Business — бизнес-слой. Причина изменения в том, что Business означает "бизнес". Это не требует дополнительных объяснений.Кроме того, сейчас слой Service используется слишком часто. Сервисы от третьих сторон действительно можно назвать Service, но то, что находится внутри бизнес-процесса, лучше всего называть Business. Service воспринимается как служба, необходимая для выполнения бизнес-функций, которая сама по себе не может завершить конкретную задачу. Поэтому Business слой ориентирован на бизнес-логику, Model слой ориентирован на схему базы данных, Controller слой ориентирован на URL-адреса, а View слой ориентирован на представление — это идеология DuckPhp.Основное значение DuckPhp заключается в его концепции. Как только эта идея внедрена, вы можете использовать любой другой фреймворк. Вы можете реализовать архитектуру контроллер-бизнес-модель без использования DuckPhp. Главное — наличие этой идеи.

Четвертое. Преимущества DuckPhp

1. Расширяемость

DuckPhp позволяет легко интегрировать ваш проект в другие проекты без необходимости модификаций. Вам не требуется выполнять повторное развитие над DuckPhp.

DuckPhp не ограничивает пространство имён вашего проекта значением "app".

DuckPhp легко интегрируется с другими PHP фреймворками. По результатам выполнения DuckPhp можно определить, следует ли продолжать работу других фреймворков.

DuckPhp поддерживает расширение. Эти расширения могут существовать независимо от DuckPhp.

2. Полная заменяемость компонентов

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

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

3. Высокая надёжность, отсутствие зависимостейDuckPhp не имеет сторонних зависимостей, поэтому вам не придётся беспокоиться о влиянии изменений сторонних библиотек. Необходимость использования 101 сторонней библиотеки для работы не требуется, что делает стабильность полностью контролируемой.

Если вы недовольны стандартной реализацией, вы также можете легко заменить её на версию, требующую сторонние зависимости.

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

4. Очень низкая связанность

DuckPhp имеет слабую связанность, что обеспечивает гибкое расширение и легкость модификации.

DuckPhp может сделать так, чтобы ваш проект был связан с кодом DuckPhp всего одной строчкой. Это то, чего другие PHP фреймворки пока не достигли. Ваш код бизнес-процесса практически не зависит от кода DuckPhp. Вам достаточно изучать бизнес-логику, а не сам фреймворк.

Переключение DuckPhp контроллеров происходит легко, они являются независимыми и простыми.

Маршрутизация DuckPhp также может использоваться самостоятельно.

5. Простота

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.

6. Гибкость и свобода

DuckPhp поддерживает маршрутизацию всего сайта, а также локальные пути маршрутизации и маршрутизацию без PATH_INFO. Это позволяет использовать его без необходимости конфигурации сервера (например, установки PATH_INFO). Можно использовать DuckPhp в подкаталогах без изменения настроек веб-сервера.

DuckPhp совместим с Composer. Он может работать даже без среды Composer. DuckPhp — это библиотека Composer, которая не требует отдельной системы сборки проектов.

7. Принцип минимального удивления (Principle of least astonishment)

DuckPhp следует принципу минимального удивления, стараясь избегать распространённых проблем:

"Откуда взялось это? Как оно здесь появилось? Чем это может помочь? Я могу удалить его?"Избегаются внезапно появляющиеся элементы, такие как аннотации.

8. Полное покрытие юнит-тестами

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

bk. Разделение ролей использования

Роль пользователя DuckPhp делится между "ビジネским инженером" и "ядерным инженером".

"Бизнес-инженер" должен заниматься только бизнес-кодом.

"Ядерный инженер" должен заниматься системой ядра.

10. Другие преимущества

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

Структура проекта DuckPhp четко разделена, без кросс-ссылок.

Классы DuckPhp стараются быть бессостоятельными.

Есть ещё много других преимуществ, которые становятся очевидными при использовании.

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

DuckPhp использует расширение WorkermanHttpd для поддержки Workerman. Нет необходимости менять исходный код проекта, и в будущем будет поддерживать больше платформ.

V. Что DuckPhp не делает* ORM и различные способы скрытия SQL. Поиск SQL по журналам намного удобнее. DuckPhp предоставляет простое обертывание PDO. Вы можете использовать свои собственные классы баз данных. Также есть примеры использования сторонних ORM (например, thinkphp-db)ссылка

  • Шаблонизатор, PHP сам по себе является шаблонизатором.
  • Widgets, они противоречат MVC.## 6. Понимание принципов работы с DuckPhpСхема архитектурных уровней DuckPhp:
           /-> View
Controller --> Business ---------------> Model
         \         \   \            /         \
          \         \   \--> Service --------> ModelEx --> ModelHelper
           \         \              \                
            \         ---------------->(Business)Helper
             \-->(Controller)Helper

arch_full

  • Controller работает по URL-входу, вызывая View и Business.
  • Business выполняется в соответствии с бизнес-логикой, вызывая Model и другие сторонние коды.
  • Model работает по таблицам базы данных, реализует операции, связанные с текущей таблицей.
  • View работает по страницам.
  • Не рекомендуется выбрасывать исключения от Model.
  1. Если между Business-компонентами происходит взаимное обращение, что делать? Добавьте компоненты с суффиксом Service для внутреннего использования Business, но не предназначенные для внешнего доступа, например, CacheService.

  2. Как быть при работе с несколькими таблицами? Три возможных решения:

    1. Добавление полей в основную таблицу, если остальные таблицы не используются.
    2. Добавление суффикса ModelEx для указания на то, что это модель нескольких таблиц, например, UserModelEx.
    3. Создание модели, которая не соответствует структуре таблиц базы данных, например, UserAndPlayerRelationModel.

7. Общие структуры проектной директории

Директория 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](docs/duckphp.gv.svg)

### Структура файлов и классов DuckPhp

(Жирным шрифтом выделены файлы, используемые при запуске системы)


## Двенадцать. Что ещё нужно сделать DuckPhp?

**Очень нужна ваша обратная связь!**

* Документация. Сейчас уже есть много документов, но они всё ещё недостаточны и требуют доработки.
* Примеры. Примеров пока слишком мало и они слишком просты.
* Более мощные примеры использования.


## Тринадцать. Ещё что сказать?
Используйте его, поддержите меня, это мотивирует меня продолжать работу над проектом.
![Логотип](duckphp.jpg)
```

Комментарии ( 0 )

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

Введение

DuckPhp — это PHP-фреймворк. Возвращение к простоте для PHPer. Развернуть Свернуть
MIT
Отмена

Обновления (4)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
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