DuckPhp 教程
第一章 快速入门
安装
假定不管什么原因,选用了 DuckPhp 这个框架,需要快速入门.
最快的方式是从 github 下载 DuckPHP。
到所在目录之下运行
php template/start_server.php
浏览器中打开 http://127.0.0.1:8080/ 得到下面欢迎页就表明 OK 了
Don't run the template file directly
Hello DuckPhp
Now is [<2020-06-14T11:45:46+08:00>]
--
(省略后面内容)
发布的时候,把网站目录指向 public/index.php 就行。
另一种安装模式: Composer 安装
在工程目录下执行:
composer require dvaknheo/duckphp # 用 require
./vendor/bin/duckphp --help # 查看有什么指令
./vendor/bin/duckphp --create # --full # --force # 创建工程
./start_server.php # --host=127.0.0.1 --port=9527 # 开始 web 服务器
将会直接把 template 的东西复制到工程并做调整,同样执行
php bin/start_server.php
浏览器中打开 http://127.0.0.1:8080/ 得到下面欢迎页就表明 OK 了
Hello DuckPhp
Now is [<2020-06-14T11:45:46+08:00>]
--
(省略后面内容)
细则可以看 —help 参数
当然你也可以用 nginx 或apache 安装。 nginx 把 document_root 配置成 public
目录。
try_files $uri $uri/ /index.php$request_uri;
第一个任务
路径: http://127.0.0.1:8080/test/done 作用是显示当前时间的任务。
对照目录结构我们要加个 test/done 显示当前时间
都在各代码段里注释了文件所在相对工程目录的位置
View 视图
先做出要显示的样子。
<?php // view/test/done.php ?>
<!doctype html><html><body>
<h1>test</h1>
<div><?=$var ?></div>
</body></html>
Controller控制器
写 /test/done 控制器对应的内容。
<?php
// app/Controller/test.php
namespace LazyToChange\Controller;
// use LazyToChange\System\BaseController;
use LazyToChange\System\Helper\ControllerHelper as C;
use LazyToChange\Business\MiscBusiness;
class test // extends BaseController
{
public function done()
{
$data=[];
$data['var']=C::H(MiscBusiness::G()->foo());
C::Show($data); // C::Show($data,'test/done');
}
}
控制器里,我们处理外部数据,不做业务逻辑,业务逻辑在 Service 层做。
BaseController 这个基类,如果不强制要求也可以不用。
MY 这个命名空间前缀可在选项 [‘namespace’] 中变更。
C::H 用来做 html编码。
C::Show($data); 是 C::Show($data,’test/done’); 的缩写, 调用 test/done 这个视图。
Service 服务
业务逻辑层。根据业务逻辑来命名。
<?php
// app/Service/MiscService.php
namespace LazyToChange\Service;
use LazyToChange\System\Helper\BusinessHelper as S;
use LazyToChange\System\BaseBusiness;
use LazyToChange\Model\MiscModel;
class MiscService extends BaseBusiness
{
public function foo()
{
$time=MiscModel::G()->getTime();
$ret="<".$time.">";
return $ret;
}
}
BaseBusiness也是不强求的,我们 extends BaseBusiness 是为了能用 G 函数这个单例方法。
这里调用了 MiscModel 。
Model 模型
完成 MiscModel 。
Model 类是实现基本功能的。一般 Model 类的命名是和数据库表一致的。
<?php
// app/Model/MiscModel.php
namespace LazyToChange\Model;
use LazyToChange\System\BaseModel;
use LazyToChange\System\Helper\ModelHelper as M;
class MiscModel extends BaseModel
{
public function getTime()
{
return DATE(DATE_ATOM);
}
}
同样 BaseModel 也是不强求的,我们 extends BaseModel 是为了能用 G 函数这个单例方法。
最后显示结果
test
<2019-04-19T22:21:49+08:00>
如果没有配置 PATH_INFO
如果你懒得配置 PATH_INFO,把 public/index.php
文件这项打开
$options['ext']['DuckPhp\\Ext\\RouteHookPathInfoCompat']=true;
同样访问 http://127.0.0.1:8080/index.php?_r=test/done 也是得到想同测试页面的结果
数据库操作
前提工作,我们注释掉 public/index.php
中跳过设置文件的选项
//$options['skip_setting_file']=true;
./vendor/bin/duckphp --create
脚本会删去这一行。
数据库演示需要数据库配置。
我们复制 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 MY\Controller;
use MY\Base\App as M;
class dbtest
{
public function main()
{
$ret = $this->foo();
var_dump($ret);
}
public function foo()
{
if (M::DB()===null) {
var_dump("No database setting!");
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 类似
快速入门演示了什么
文件型路由,分层思维
快速入门没演示什么
异常处理,扩展 等高级内容
--