[toc]
Предположим, что вы выбрали фреймворк 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 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
, которая будет отображать текущее время.
Местоположение всех файлов указано в комментариях к каждому кодовому фрагменту.
Сначала создайте внешний вид для отображения данных.
@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>
Напишите содержимое контроллера /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, откройте опцию в файле 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 )