DuckPhp 教程

第一章 快速入门

安装

假定不管什么原因,选用了 DuckPhp 这个框架,需要快速入门.

最快的方式是从 github 下载 DuckPHP。

到所在目录之下运行

  1. php template/start_server.php

浏览器中打开 http://127.0.0.1:8080/ 得到下面欢迎页就表明 OK 了

  1. Don't run the template file directly
  2. Hello DuckPhp
  3. Now is [<2020-06-14T11:45:46+08:00>]
  4. --
  5. (省略后面内容)

发布的时候,把网站目录指向 public/index.php 就行。

另一种安装模式: Composer 安装

在工程目录下执行:

  1. composer require dvaknheo/duckphp # 用 require
  2. ./vendor/bin/duckphp --help # 查看有什么指令
  3. ./vendor/bin/duckphp --create # --full # --force # 创建工程
  4. ./start_server.php # --host=127.0.0.1 --port=9527 # 开始 web 服务器

将会直接把 template 的东西复制到工程并做调整,同样执行

  1. php bin/start_server.php

浏览器中打开 http://127.0.0.1:8080/ 得到下面欢迎页就表明 OK 了

  1. Hello DuckPhp
  2. Now is [<2020-06-14T11:45:46+08:00>]
  3. --
  4. (省略后面内容)

细则可以看 —help 参数

当然你也可以用 nginx 或apache 安装。 nginx 把 document_root 配置成 public 目录。

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

第一个任务

路径: http://127.0.0.1:8080/test/done 作用是显示当前时间的任务。

对照目录结构我们要加个 test/done 显示当前时间

都在各代码段里注释了文件所在相对工程目录的位置

View 视图

先做出要显示的样子。

  1. <?php // view/test/done.php ?>
  2. <!doctype html><html><body>
  3. <h1>test</h1>
  4. <div><?=$var ?></div>
  5. </body></html>

Controller控制器

写 /test/done 控制器对应的内容。

  1. <?php
  2. // app/Controller/test.php
  3. namespace LazyToChange\Controller;
  4. // use LazyToChange\System\BaseController;
  5. use LazyToChange\System\Helper\ControllerHelper as C;
  6. use LazyToChange\Business\MiscBusiness;
  7. class test // extends BaseController
  8. {
  9. public function done()
  10. {
  11. $data=[];
  12. $data['var']=C::H(MiscBusiness::G()->foo());
  13. C::Show($data); // C::Show($data,'test/done');
  14. }
  15. }

控制器里,我们处理外部数据,不做业务逻辑,业务逻辑在 Service 层做。

BaseController 这个基类,如果不强制要求也可以不用。

MY 这个命名空间前缀可在选项 [‘namespace’] 中变更。

C::H 用来做 html编码。

C::Show($data); 是 C::Show($data,’test/done’); 的缩写, 调用 test/done 这个视图。

Service 服务

业务逻辑层。根据业务逻辑来命名。

  1. <?php
  2. // app/Service/MiscService.php
  3. namespace LazyToChange\Service;
  4. use LazyToChange\System\Helper\BusinessHelper as S;
  5. use LazyToChange\System\BaseBusiness;
  6. use LazyToChange\Model\MiscModel;
  7. class MiscService extends BaseBusiness
  8. {
  9. public function foo()
  10. {
  11. $time=MiscModel::G()->getTime();
  12. $ret="<".$time.">";
  13. return $ret;
  14. }
  15. }

BaseBusiness也是不强求的,我们 extends BaseBusiness 是为了能用 G 函数这个单例方法。

这里调用了 MiscModel 。

Model 模型

完成 MiscModel 。

Model 类是实现基本功能的。一般 Model 类的命名是和数据库表一致的。

  1. <?php
  2. // app/Model/MiscModel.php
  3. namespace LazyToChange\Model;
  4. use LazyToChange\System\BaseModel;
  5. use LazyToChange\System\Helper\ModelHelper as M;
  6. class MiscModel extends BaseModel
  7. {
  8. public function getTime()
  9. {
  10. return DATE(DATE_ATOM);
  11. }
  12. }

同样 BaseModel 也是不强求的,我们 extends BaseModel 是为了能用 G 函数这个单例方法。

最后显示结果

  1. test
  2. <2019-04-19T22:21:49+08:00>

如果没有配置 PATH_INFO

如果你懒得配置 PATH_INFO,把 public/index.php 文件这项打开

  1. $options['ext']['DuckPhp\\Ext\\RouteHookPathInfoCompat']=true;

同样访问 http://127.0.0.1:8080/index.php?_r=test/done 也是得到想同测试页面的结果

数据库操作

前提工作,我们注释掉 public/index.php 中跳过设置文件的选项

  1. //$options['skip_setting_file']=true;

./vendor/bin/duckphp --create 脚本会删去这一行。

数据库演示需要数据库配置。

我们复制 config/setting.sample.phpconfig/setting.php

  1. return [
  2. 'duckphp_is_debug' => false,
  3. 'duckphp_platform' => 'default',
  4. //*
  5. 'database_list' => [
  6. [
  7. 'dsn' => 'mysql:host=127.0.0.1;port=3306;dbname=DnSample;charset=utf8mb4;',
  8. 'username' => 'admin',
  9. 'password' => '123456',
  10. 'driver_options' => [],
  11. ],
  12. ],
  13. //*/
  14. ];

然后,我们写 app/Controller/dbtest.php 如下

  1. namespace MY\Controller;
  2. use MY\Base\App as M;
  3. class dbtest
  4. {
  5. public function main()
  6. {
  7. $ret = $this->foo();
  8. var_dump($ret);
  9. }
  10. public function foo()
  11. {
  12. if (M::DB()===null) {
  13. var_dump("No database setting!");
  14. return;
  15. }
  16. $sql = "select 1+? as t";
  17. $ret = M::DB()->fetch($sql,2);
  18. return $ret;
  19. }
  20. }

访问 http://127.0.0.1:8080/dbtest/main 会得到

  1. array('t'=>3);

M::DB() 的几个方法 fetch fetchAll,execute 和 pdo 类似

快速入门演示了什么

文件型路由,分层思维

快速入门没演示什么

异常处理,扩展 等高级内容

--