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

OSCHINA-MIRROR/dvaknheo-duckphp

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

Учебник DuckPhp

[toc]

Глава 1. Быстрый старт

Установка

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

Самый быстрый способ — скачать DuckPhp с GitHub.

Перейдите в нужную директорию и выполните следующие команды:

cd template
php cli.php run

Откройте браузер и перейдите по адресу http://127.0.0.1:8080/. Если вы видите страницу приветствия, это значит, что всё работает правильно.

Не запускайте шаблонные файлы напрямую
Привет DuckPhp

Текущее время: [2020-06-14T11:45:46+08:00]
--
(все последующие данные опущены)

Для публикации сайта достаточно указать путь к файлу public/index.php.

Другой метод установки: использование Composer

Выполните следующие команды в корневой директории вашего проекта:

composer require dvaknheo/duckphp # используйте require
./vendor/bin/duckphp new --help   # просмотреть доступные команды
./vendor/bin/duckphp new          # создать новый проект
./vendor/bin/duckphp run          # --host=127.0.0.1 --port=9527 # запустить веб-сервер

Откройте браузер и перейдите по адресу http://127.0.0.1:8080/. Если вы видите страницу приветствия, это значит, что всё работает правильно.

Привет DuckPhp

Текущее время: [2020-06-14T11:45:46+08:00]
--
(все последующие данные опущены)

Конечно, вы также можете использовать Nginx или Apache для установки.

Для конфигурации Nginx установите document_root как public директорию.Конфигурация Nginx:

try_files $uri $uri/ /index.php$request_uri;

Первое задание

Адрес: http://127.0.0.1:8080/test/done Задача отображает текущее время.

Для этого вам потребуется добавить директорию test/done, которая будет отображать текущее время.

Местоположение всех файлов указано в комментариях к каждому кодовому фрагменту.

Вид (View)

Сначала создайте внешний вид для отображения данных.

@script File: template/view/test/done.php

<?php declare(strict_types=1);
// view/test/done.php?>
<!DOCTYPE html><html><body>
<h1>тест</h1>
<div><?= $var ?></div>
</body></html>

Контроллер (Controller)

Напишите содержимое контроллера /test/done.

@script File: template/src/Controller/testController.php

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

use ProjectNameTemplate\Business\DemoBusiness;

class TestController
{
    public function action_done()
    {
        $var = DemoBusiness::_()->foo();
        Helper::show(get_defined_vars());
    }
}

В контроллере мы обрабатываем входящие данные, но не выполняем бизнес-логику. Бизнес-логика находится в слое Business.

Префикс ProjectNameTemplate является префиксом пространства имён проекта, который можно изменить позднее. Helper.php содержимое

Вызов Helper::show($data) является сокращением для Helper::show($data, 'test/done'), который вызывает этот шаблон.

Бизнес-слой

Слой бизнес-логики. Название слоя должно отражать его назначение.

@script Файл: template/src/Business/DemoBusiness.php

<?php declare(strict_types=1);
/**
 * DuckPhp
 * Отныне вы никогда не будете одиноки~
 */
namespace ProjectNameTemplate\Business;
```use ProjectNameTemplate\Business\Base;
use ProjectNameTemplate\Business\Helper;
use ProjectNameTemplate\Model\DemoModel;

class DemoBusiness extends Base
{
    public function foo()
    {
        return "<" . DemoModel::_()->foo() . ">";
    }

    public function getDocData($f)
    {
        $ref = new \ReflectionClass(\DuckPhp\DuckPhp::class);
        $path = realpath(dirname($ref->getFileName()) . '/../docs') . '/';
        $file = realpath($path . $f);
        if (substr($file, 0, strlen($path)) !== $path) {
            return '';
        }
        $str = file_get_contents($file);
        if (substr($file, -3) === '.md') {
            $str = preg_replace('/([a-z_]+\.gv\.svg)/', '?f=$1', $str); // преобразование файла gv в файл md
        }
        return $str;
    }

    public function testdb()
    {
        return DemoModel::_()->testdb();
    }
}

Мы расширяем базовый класс Base для использования метода DemoBusiness::G() как переменной одного экземпляра.

Здесь используется класс MiscModel.

Модель

Реализация класса MiscModel.

Класс модели предназначен для выполнения основных функций. Обычно название класса модели совпадает с названием таблицы в базе данных.

@script Файл: template/src/Model/DemoModel.php

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

use ProjectNameTemplate\Model\Base;
use ProjectNameTemplate\Model\Helper;

class DemoModel extends Base
{
    public function foo()
    {
        return date(DATE_ATOM);
    }

    public function testdb()
    {
        $sql = 'SELECT 1 + ? AS t';
        $ret = Helper::Db()->fetch($sql, 2);
        return $ret;
    }
}

Базовый класс Base также может использоваться для реализации метода DemoModel::G() как переменной одного экземпляра.

Последний вывод результата

тест
```<2019-04-19T22:21:49+08:00>

Если PATH_INFO не настроен

Если вам лень настраивать PATH_INFO, откройте опцию в файле app/System/App.php

'path_info_compact_enable' => false,

Аналогично, доступ к адресу http://127.0.0.1:8080/index.php?_r=test/done также приведёт к тому же тестовой странице.### Операции с базой данных Для начала работы включите опцию отключения файла конфигурации в файле src/System/App.php.

'setting_file_enable' => true,

Демонстрация работы с базой данных требует наличия конфигурационных данных.

Скопируйте файл config/setting.sample.php в config/setting.php.

return [
    'duckphp_is_debug' => false,
    'duckphp_platform' => 'default',
    //*
    'database_list' => [
        [
            'dsn' => 'mysql:host=127.0.0.1;port=3306;dbname=DnSample;charset=utf8mb4;',
            'username' => 'admin',
            'password' => '123456',
            'driver_options' => [],
        ],
    ],
    //*/
];

Затем создайте файл app/Controller/dbtest.php, содержащий следующий код:

namespace LazyToChange\Controller;
use LazyToChange\System\App as M;

class dbtest
{
    public function main()
    {
        $ret = $this->foo();
        var_dump($ret);
    }

    public function foo()
    {
        if (M::Db() === null) {
            var_dump("Нет настроек базы данных!");
            return;
        }
        $sql = "select 1 + ? as t";
        $ret = M::Db()->fetch($sql, 2);
        return $ret;
    }
}

После этого доступ к странице можно получить по адресу http://127.0.0.1:8080/dbtest/main

Вы получите ответ:

array('t' => 3);

Методы M::DB() такие как fetch, fetchAll, execute аналогичны методам PDO.

Что демонстрируется в разделе «Быстрый старт»

Файловое маршрутизирование, слоистая архитектура мышления


Обработка ошибок, расширение и другие продвинутые темы

## Узнать большеПерейти к [**странице содержания**](index.md), которая является входной точкой для всех документов.

```markdown
array(
    0 => 'autoload.php',                           // файл автозагрузки при отсутствии Composer
    1 => 'src/Component/DbManager.php',           // менеджер баз данных
    2 => 'src/Component/ExtOptionsLoader.php',    // загрузка расширенных опций (из DuckPhpApps.config.php)
    3 => 'src/Component/GlobalAdmin.php',         // глобальный администратор
    4 => 'src/Component/GlobalUser.php',          // глобальная база данных
    5 => 'src/Component/RedisManager.php',        // менеджер Redis
    6 => 'src/Component/RouteHookResource.php',   // хук для ресурсов
    7 => 'src/Component/RouteHookRewrite.php',    // хук для переопределения URL
    8 => 'src/Component/RouteHookRouteMap.php',   // хук для маршрутизации
    9 => 'src/Component/ZCallTrait.php',          // вызов между этапами
    10 => 'src/Core/App.php',                      // основной класс приложения
    11 => 'src/Core/AutoLoader.php',              // автозагрузчик
    12 => 'src/Core/ComponentBase.php',           // базовый компонент
    13 => 'src/Core/Console.php',                 // консольное управление
    14 => 'src/Core/EventManager.php',            // менеджер событий
    15 => 'src/Core/ExceptionManager.php',        // менеджер исключений
    16 => 'src/Core/Functions.php',               // глобальные функции
    17 => 'src/Core/KernelTrait.php',             // трейт ядра
    18 => 'src/Core/Logger.php',                  // логгер
    19 => 'src/Core/PhaseContainer.php',          // контейнер этапов
    20 => 'src/Core/Route.php',                   // маршрутизация
    21 => 'src/Core/Runtime.php',                 // время выполнения
    22 => 'src/Core/SingletonTrait.php',          // трейт одиночки
    23 => 'src/Core/SuperGlobal.php',             // суперглобальные переменные
    24 => 'src/Core/SystemWrapper.php',
)
``````json
{
    "php",               // обертка системных функций
    25 => "src/Core/View.php",                    // представление
    26 => "src/DuckPhp.php",                      // входной класс
    27 => "src/Ext/CallableView.php",             // расширение, представление для вызова
    28 => "src/Foundation/SimpleBusinessTrait.php",   // трейт бизнес-логики
    29 => "src/Foundation/SimpleControllerTrait.php", // трейт контроллеров
    30 => "src/Foundation/SimpleModelTrait.php",      // трейт моделей
    31 => "src/Foundation/SimpleSingletonTrait.php",  // простой трейт одиночки
    32 => "src/Helper/ControllerHelperTrait.php",     // трейт помощника контроллеров
    33 => "template/config/DuckPhpApps.config.php",   // конфигурация приложений
    34 => "template/config/DuckPhpSettings.config.php",   // конфигурационные настройки
    35 => "template/public/dbtest",
 }
 ``````markdown
 'php',               # Мы вызвали класс dbtest дополнительного приложения
    36 => 'template/public/index.php',                # Входной класс
    37 => 'template/src/Controller/Base.php',         # Базовый контроллер
    38 => 'template/src/Controller/Helper.php',       # 
    39 => 'template/src/Controller/MainController.php',
    40 => 'template/src/System/App.php',
    41 => 'template/view/files.php',
 )
 ``````markdown
  0 => 'autoload.php',                          // Файл автозагрузки при отсутствии Composer
  11 => 'src/Core/AutoLoader.php',              // Автозагрузчик

  17 => 'src/Core/KernelTrait.php',             // Основной trait
  10 => 'src/Core/App.php',                     // Основной базовый класс
  12 => 'src/Core/ComponentBase.php',           // Базовый компонент
  22 => 'src/Core/SingletonTrait.php',          // Trait одиночки
  16 => 'src/Core/Functions.php',               // Глобальные функции
  19 => 'src/Core/PhaseContainer.php',          // Контейнер фаз
  13 => 'src/Core/Console.php',                 // Обработка командной строки

  14 => 'src/Core/EventManager.php',            // Управление событиями
  15 => 'src/Core/ExceptionManager.php',        // Управление исключениями
  20 => 'src/Core/Route.php',                   // Роутинг
  21 => 'src/Core/Runtime.php',                 // Временная среда выполнения
  25 => 'src/Core/View.php',                    // Шаблонизатор

  18 => 'src/Core/Logger.php',                  // Логгер
  23 => 'src/Core/SuperGlobal.php',             // Глобальные переменные
  24 => 'src/Core/SystemWrapper.php',           // Обертка системных функций

  2 => 'src/Component/ExtOptionsLoader.php',    // Загрузка дополнительных опций (из DuckPhpApps.config.php)

  26 => 'src/DuckPhp.php',                      // Главный входной класс
  6 => 'src/Component/RouteHookResource.php',   // Хук для ресурсов
  7 => 'src/Component/RouteHookRewrite.php',    // Хук для переопределения URL
  8 => 'src/Component/RouteHookRouteMap.php',   // Хук для маршрутизации
  9 => 'src/Component/ZCallTrait.php',          // Хук для вызова между фазами

  1 => 'src/Component/DbManager.php',           // Управление базой данных
  5 => 'src/Component/RedisManager.php'         // Управление Redis

Все необходимые изменения были сделаны, чтобы обеспечить правильность и согласованность текста.```markdown 3 => 'src/Component/GlobalAdmin.php', // Глобальный администратор 4 => 'src/Component/GlobalUser.php', // Глобальная таблица пользователей

28 => 'src/Foundation/SimpleBusinessTrait.php', // Trait бизнес-логики 29 => 'src/Foundation/SimpleControllerTrait.php', // Trait контроллеров 30 => 'src/Foundation/SimpleModelTrait.php', // Trait моделей 31 => 'src/Foundation/SimpleSingletonTrait.php', // Простой Trait одиночки

32 => 'src/Helper/ControllerHelperTrait.php' // Trait помощника контроллеров 33 => 'шаблон/конфиг/DuckPhpApps.config.php', // Конфигурационный файл DuckPhpApps 34 => 'шаблон/конфиг/DuckPhpSettings.config.php', // Конфигурационный файл DuckPhpSettings

36 => 'шаблон/public/index.php', // Входной файл 37 => 'шаблон/src/Controller/Base.php', // Базовый контроллер 38 => 'шаблон/src/Controller/Helper.php', // Контроллер помощник 39 => 'шаблон/src/Controller/MainController.php',// Главный контроллер

40 => 'шаблон/src/System/App.php', // Приложение 41 => 'шаблон/view/files.php', // Файлы представления

27 => 'src/Ext/CallableView.php', // Расширение, вызываемый режим представлений 35 => 'template/public/dbtest.php', // Мы вызвали класс dbtest дополнительного приложения

Почему установка должна выполняться в командной строке? Потому что командная строка позволяет превзойти права безопасности веб-пользователя. Недостаточно учитывать безопасность от имени веб-пользователя.


Опубликовать ( 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