【thinkphp5框架的目录结构,以及使用框架model 、controler、view的使用,以及错误调试和日志记录】
ThinkPHP5 在php5.5版本以上”No input file specified“问题解决:
public/.htaccess文件中的
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
在默认情况下会导致No input file specified.
修改成
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
问题解决
配置文件的使用
application/index.controller/Demo.php
php namespace app\index\controller; use think\Config; class Demo extends Base{ // 配置文件的使用 public function config() { // 默认一页显示15条 $config = Config::get("paginate"); dump($config);//15 $config = config("paginate.type"); dump(config("?paginate"));//boolean true $config = config("paginate.type"); dump(config("?paginate111"));//boolean false dump(Config::has("paginate"));//boolean true dump(config("cyy")); // array (size=1) // cyy' => int 1 dump(config("redis.host"));//string '127.0.0.1' } }
application/extra/redis.php
php // 配置文件的使用 return [ "host" => "127.0.0.1", ];
application/index/config/php
php // 配置文件的使用 return [ "cyy" => [ 'cyy' => 1, ] ];
路由的使用
自定义路由
application/index/controller/Video.php
php namespace app\index\controller; class Video extends Controller { // 自定义路由 public function getVideo() { $id = input("param.id"); // http://phptest.com/index/video/getVideo?id=2 // => 域名/video/2 dump($id); } }
application/route.php
php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st// +---------------------------------------------------------------------- use think\Route; // 自定义路由 域名/video/2 // Route::rule("video/:id", "index/Video/getVideo"); //Route::get("video/:id", "index/Video/getVideo");// 定义Get请求路由 //Route::post("video/:id", "index/Video/getVideo");// 定义Post请求路由 // 组合写法 Route::get([ 'video/:id' => ["index/Video/getVideo", [], ['id' => '\d+']], ]);
控制器的使用
application/index/controller/Demo.php
php namespace app\index\controller; use think\Config; use think\Request; class Demo extends Base{ /** * 初始化 * @auth cyy * @return [type] [description] */ public function _initialize() { dump("这是initialize"); } public function test() { // 数组转json格式返回 return json(["as" => 1, "cyy" => "test"]); } public function hello() { var_dump(input("param.")); return "index-index-hello"; } // 控制器-跳转 public function abc() { $id = input("param.id", 0, "intval"); if($id == 1) { $this->success("操作成功", "admin/index/index"); }elseif($id == 2) { $this->error("操作失败"); } } // 控制器-重定向 public function ef() { $this->redirect("hello", ["id" => 1, "ms" => 123]); //redirect("https://baidu.com"); } // 控制器-请求 public function requestData() { $request = Request::instance(); //访问http://phptest.com/index/demo/requestData?ids=2 dump(request()->isPost());//boolean false dump(input("?get.ids"));//boolean true dump(request()->has("ids", "get"));//boolean true } }
application/index/controller/Base.php
php namespace app\index\controller; use think\Controller; class Base extends Controller { /** * 空操作 * @auth singwa * @param [type] $name [description] * @return [type] [description] */ // 控制器-空操作 public function _empty($name) { // todo return $name; } }
数据库配置与model层数据操作
application/database.php
php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st// +---------------------------------------------------------------------- return [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => 'localhost', // 数据库名 'database' => 'test', // 用户名 'username' => 'root', // 密码 'password' => '123456', // 端口 'hostport' => '3306', // 连接dsn 'dsn' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'test_', // 数据库调试模式 'debug' => true, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 数据集返回类型 'resultset_type' => 'array', // 自动写入时间戳字段 'auto_timestamp' => false, // 时间字段取出后的默认时间格式 'datetime_format' => false, // 是否需要进行SQL性能分析 'sql_explain' => false, ];
模型
application/common/model/Base.php
php namespace app\common\model; use think\Model; class Base extends Model{ protected $autoWriteTimestamp = true; //protected $createTime = 'create_a_time'; /** * 新增逻辑 * @auth singwa * @param array $data [description] * @return int */ public function add($data = []) { if(empty($data) || !is_array($data)) { return false; } $this->allowField(true)->save($data); return $this->id; } }
application/common/model/Video.php
php namespace app\common\model; class Video extends Base{ /** * 定义一个关联 1-1 * @auth singwa * @return [type] [description] */ public function videoFile() { return $this->hasOne("VideoFile"); // video_id } }
application/common/model/VideoFile.php
php namespace app\common\model; class VideoFile extends Base{ }
application/index/controller/Video.php
php namespace app\index\controller; use think\Db; use app\common\model\Video as VideoModel; class Video extends Base { // 数据库query查询 public function mysql() { $video = Db::query("select * from test_video where id=2"); dump($video); } // 模型的使用 public function model() { // 获取id为2的数据 $video = VideoModel::get(2); //dump($video); $video = new VideoModel(); $video->title = "cyy-test"; $video->description = "cyy-test-description1"; //dump($video->save());//int 1 插入数据保存成功 $data = [ "title" => "cyy-test3", ]; //dump($video->save($data));//dump($video->save());//int 1 插入数据保存成功 } // 增 public function add() { $video = model("Video"); $data = [ "title" => "cyy-test6", "mpt" => 1, ]; $id = $video->add($data); dump($id);//string '6' (length=1) } // 查 public function select() { $conditon = [ "status" => 1, ]; //$videos = model("Video")->where($conditon)->select(); $videos = model("Video") ->where($conditon) ->limit(1) ->order("id", "desc") ->select(); dump($videos); } // 改 public function update() { $updataData = [ "title" => "cyy你好鸭" ]; $whereCondition = [ "id" => 1, ]; //$res = model("Video")->allowField(true)->save($updataData, $whereCondition); //echo model("Video")->getLastSql(); //作用非常重要 //dump($res); model("Video")->where($whereCondition) ->update($updataData); echo model("Video")->getLastSql();//UPDATE `test_video` SET `title`='cyy你好鸭' WHERE `id` = 1 } // 删 public function delete() { // 这种场景是 真正的删除 /*$res = model("Video")->where("id", ">", 18)->delete(); echo model("Video")->getLastSql(); dump($res);*/ // 在实际工作当中 我们的删除一般不直接删除, 所以一般假删除 // 修改status => -1 model("Video")->where(["id" => 6]) ->update(["status" => -1]); echo model("Video")->getLastSql();//UPDATE `test_video` SET `status`=-1 WHERE `id` = 6 } //一对一关联 public function correlation() { $video = model("Video")->find(1); //halt($video->videoFile->file); //dump(VideoModel::hasWhere("videoFile", ["video_id" => 1])->find());//string 'file1' (length=5) // 1vs1 插入 model("Video")->title = "1VS1-add-test"; model("Video")->image = "1vs1.gif"; model("VideoFile")->file = "1vs1.flv"; model("VideoFile")->status = 1; model("Video")->VideoFile = model("VideoFile"); //dump(model("Video")->together("VideoFile")->save()); // 1vs1 更新操作 $video = model("Video")->find(1); $video->title = "1vs1-update-test"; $video->videoFile->file = "1vs1-update.mp4"; //dump($video->together("videoFile")->save()); // 1 vs N 查询 //dump(model("Video")->videoFile()->where("video_id", 1)->select()); //dump(VideoModel::hasWhere('videoFile', ["video_id" => 1])->select()); } }
视图层
application/index/controller/Video.php
php namespace app\index\controller; use think\Db; use app\common\model\Video as VideoModel; class Video extends Base { public function demo() { $video = model("Video")->where(["id" => 1])->find(); $videos = model("Video")->where("id", ">", 1)->select(); // halt($video->update_time);//halt=dump+exit // halt($video->update_time); // halt($video->toArray()); return $this->fetch("", [ "name" => "cyy", "names" => ["name" => "hello , cyy!"], "video" => $video, "videos" => $videos, "id" => input("param.id") ]); } }
application/index/view/video/demo.html
<html> <body> {$name}<br /> {$names['name']}<br /> {$names.name}<br /> {$video->title}<br /> {$video.title}<br /> {$video:title}<br /> {eq name="name", value="cyy1"} cyy您好1111<br /> {else /} 不是cyy<br /> {/eq} {$Request.get.id}<br /> {$video->create_time|date="Y-m-d H", ###}<br/> {$video->status|status}<br/> {volist name="videos" id="vo"} {$vo.id} -------- {$vo.title} <br / > {/volist} body> html>
日志定位
application/index/controller/Demo.php
php namespace app\index\controller; use think\Config; use think\Request; use think\Log;// 日志定位 class Demo extends Base{ public function logtest() { Log::write("testlog".json_encode(input("param."))); return 1; } }
runtime/log下的当天文件夹里的.log文件
[ 2020-01-17T13:02:47+08:00 ] 127.0.0.1 127.0.0.1 GET /index/demo/logtest?mst=1&mp=45 [ log ] phptest.com/index/demo/logtest?mst=1&mp=45 [运行时间:0.022899s][吞吐率:43.67req/s] [内存消耗:1,372.95kb] [文件加载:33] [ log ] testlog{"mst":"1","mp":"45"} [ 2020-01-17T13:02:47+08:00 ] 127.0.0.1 127.0.0.1 GET /index/demo/logtest?mst=1&mp=45 [ log ] phptest.com/index/demo/logtest?mst=1&mp=45 [运行时间:0.233506s][吞吐率:4.28req/s] [内存消耗:1,571.42kb] [文件加载:40] [ info ] [ LANG ] D:\phpstudy_pro\WWW\phptest\thinkphp\lang\zh-cn.php [ info ] [ ROUTE ] array ( 'type' => 'module', 'module' => array ( 0 => 'index', 1 => 'demo', 2 => 'logtest', ), ) [ info ] [ HEADER ] array ( 'cookie' => 'thinkphp_show_page_trace=0|0; pgv_pvi=98915328; pgv_si=s6064574464; thinkphp_show_page_trace=0|0', 'accept-language' => 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 'accept-encoding' => 'gzip, deflate', 'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36', 'upgrade-insecure-requests' => '1', 'cache-control' => 'no-cache', 'pragma' => 'no-cache', 'connection' => 'close', 'host' => 'phptest.com', ) [ info ] [ PARAM ] array ( 'mst' => '1', 'mp' => '45', ) [ info ] [ RUN ] app\index\controller\Demo->logtest[ D:\phpstudy_pro\WWW\phptest\application\index\controller\Demo.php ] [ info ] [ LOG ] INIT File
trace调试
application/config.php
// 应用调试模式 'app_debug' => true, // 应用Trace 'app_trace' => true,
application/index/controller/Demo.php
php namespace app\index\controller; use think\Config; use think\Request; use think\Log;// 日志定位 class Demo extends Base{ public function logtest() { $mrs = model("Video")->where(["id" => 2])->find(); echo model("Video")->getLastSql(); return 1; } }
变量调试
application/index/controller/Demo.php
php namespace app\index\controller; use think\Config; use think\Request; use think\Log;// 日志定位 class Demo extends Base{ public function logtest() { // prinr_r(); // var_dump(); // 类似断点调试 dump(input("param.")); halt(input("param.")); // dump() exit; return 1; } }
性能调试
application/index/controller/Demo.php
php namespace app\index\controller; use think\Config; use think\Request; use think\Log;// 日志定位 use think\Debug;//性能调试 class Demo extends Base{ public function logtest() { debug("start1");//--开始标记 $mrs = model("Video")->where(["id" => 2])->find(); //echo model("Video")->getLastSql(); debug("end1");//--结束标记 dump(debug("start1", "end1", 4));//string '0.0241' dump(debug("start1", "end1", "m"));//string '1.2 MB' //第三个参数如果是数字代表记录时间;如果是'm'代表记录内存使用 return 1; } }
sql调试
application/index/controller/Demo.php
php namespace app\index\controller; use think\Config; use think\Request; use think\Log;// 日志定位 use think\Debug;//性能调试 class Demo extends Base{ public function logtest() { $mrs = model("Video")->where(["id" => 2])->find(); echo model("Video")->getLastSql(); return 1; } }