学习TP框架(一)
来源:互联网 发布:主机域名是什么 编辑:程序博客网 时间:2024/06/06 05:57
前言:
初次接触TP5,所以只能一边翻tp手册,熟悉基本用法,同时在app开发后台路上,继续往前拱一点。不做技术半吊子(不知其所以然),从我做起!!^_^
练习代码:
201717/4/27
<?phpnamespace app\index\controller;use think\Controller;use think\Request;class Index extends Controller { /* * 请求信息---获取请求参数 * 用处:从客户端那取参数 */ public function requestParam() { $request = Request::instance(); echo '请求方法:' . $request->method() . '<br/>'; echo '资源类型:' . $request->type() . '<br/>'; echo '访问地址:' . $request->ip() . '<br/>'; echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>'; echo '请求参数:'; dump($request->param()); echo '请求参数:仅包含name'; dump($request->only(['name'])); echo '请求参数:排除name'; dump($request->except(['name'])); } /* * 请求信息---获取模块名称、控制器名称、获取操作名称 */ public function requestController() { $request = Request::instance(); echo "当前模块名称是" . $request->module(); echo "当前控制器名称是" . $request->controller(); echo "当前操作名称是" . $request->action(); } /* * 请求信息---获取URL */ public function requestURL() { $request = Request::instance(); // 获取当前域名 echo 'domain: ' . $request->domain() . '<br/>'; // 获取当前入口文件 echo 'file: ' . $request->baseFile() . '<br/>'; // 获取当前URL地址 不含域名 echo 'url: ' . $request->url() . '<br/>'; // 获取包含域名的完整URL地址 echo 'url with domain: ' . $request->url(true) . '<br/>'; // 获取当前URL地址 不含QUERY_STRING echo 'url without query: ' . $request->baseUrl() . '<br/>'; // 获取URL访问的ROOT地址 echo 'root:' . $request->root() . '<br/>'; // 获取URL访问的ROOT地址 echo 'root with domain: ' . $request->root(true) . '<br/>'; // 获取URL地址中的PATH_INFO信息 echo 'pathinfo: ' . $request->pathinfo() . '<br/>'; // 获取URL地址中的PATH_INFO信息 不含后缀 echo 'pathinfo: ' . $request->path() . '<br/>'; // 获取URL地址中的后缀信息 echo 'ext: ' . $request->ext() . '<br/>'; } /* * 因为继承了Controller 所以覆盖构造方法 */ public function _initialize() { echo 'init<br/>'; //return 'init success!'; } /* * 入口文件 */ public function index() { //获取URL $this->requestURL(); //获取模块名 控制名 操作名 $this->requestController(); // 获取参数 $this->requestParam();// exit;//退出 return '张铁牛';// $data = ['name'=>'thinkphp','url'=>'thinkphp.cn']; //支持明确格式的输出// return json(['data'=>$data,'code'=>1,'message'=>'操作完成']);// return xml(['data'=>$data,'code'=>1,'message'=>'操作完成']); } /* * 当前模块名是index * 控制器名是 index * 操作名(函数名)test */ public function test() { //获取模块名 控制名 操作名 $this->requestController(); return '我是张铁牛2号'; } /* * 测试变态特性:设置某操作执行前必须执行的方法。也叫前置操作 */ protected $beforeActionList = [ 'first', //没有设值,就默认在所有方法(除了_initialize)调用 'second' => ['except' => 'hello'], 'three' => ['only' => 'hello,data'], //只有调用hello data时,才调用three ]; protected function first() { echo 'first<br/>'; } protected function second() { echo 'second<br/>'; } protected function three() { echo 'three<br/>'; } public function hello() { return 'hello'; } public function data() { return 'data'; }}
小结:
- 入口文件中不应该包含过多代码(就像安卓Activity中不适合写过多的代码),所以应该将代码拆分,还index.php一个清爽的样子。解决办法:新增文件(入口文件),新建文件夹(创建模块)
- 每次测试入口文件中的操作(成员函数)时候,必须输入一大串URL(比如:requestURL函数 ,我需要这样才能访问 http://localhost/index/index/requestURL 次数多了,就头大),有没有偷懒(高效!)更短的URL。解决办法:tp手册上有个路由注册,还有路由批量注册,明天试试。
2017/4/28
1、url路径太长,百度谷歌不收录怎么办?(配置路由)
方法1:修改application下的route.php(路由配置文件)。注意要把原来的代码注释掉,就是下面这些代码。
return [ '__pattern__' => [ 'name' => '\w+', ], '[hello]' => [ ':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']], ':name' => ['index/hello', ['method' => 'post']], ], //规则:如果url以index/index开头(不管后面有没有name) 都把他路由到index/index/hello中进行处理 //但是 出问题了 //当我想访问http://localhost/index/index/requestParam时,他给我路由到hello方法上了,这不是我想要的结果,怎么办? //试错1:单个配置路由 //试错2:重新理解注册规则 //'[:param ]'=> ['index/index/hello/name/sdf',['method' => 'get']]];
这是我配置的路由
// 路由有什么用?//问题:url路径太长,百度谷歌不收录怎么办?//解决办法:配置URL路由(SEO优化)//试错1:单个配置路由//这个方法比较好用//但是路由定义好后,之前的url就失效了//比如localhost/hello 可以//对应的localhost/index/index/hello就失效use think\Route;Route::rule('hello', 'index/index/hello');//Route::rule('index','index/index/index');Route::rule('rparam','index/index/requestParam' );Route::rule('rurl','index/index/requestURL');Route::rule("rcontroller",'index/index/requestController');
上图:
继续28号的新内容:
2、url中的值是怎么传给php程序的?(TP5参考手册)
//$param 这里是默认的请求参数绑定 public function hello($param) { //有静态方法用,为什么还需要创建对象来浪费内存呢 $request = Request::instance(); //用has方法检测变量是否赋值 //在url只赋值必须是这样的 // name(变量名)/11(值) //完整URL:http://localhost/hello/people/666 //结果:flag:1 输出:hello666 $flag = $this->request->has("people"); echo $flag; // 着这种方法测试成功 //$param = Request::instance()->param('people'); //这种也测试成功 //$param = $this->request->param('people'); //为什么下面这个不行 //中间的reuquest前面不能加美元符号 //所以去掉就行了 //$param = $this->request->param('people'); return 'hello'.$param; }
3、如何操作数据库(修改配置文件)
tp开发官方手册http://www.kancloud.cn/manual/thinkphp5/118060,新手按照图片tp手册能做对个十有八九,但还是有些小细节需要注意下。使用xmapp集成环境开始时,由于PHPMyAdamin中config.inc.php(C:\xampp\phpMyAdmin\config.inc.php)的密码默认是空,所以使用xmapp管理数据库时出错时,要记得同步修改上面文件的对应项目。这里感谢http://blog.csdn.net/lioncode/article/details/7917310,写的真的真的很好,学习了。
出错图:
4、小结:
1、没必要创建对象时,就没必要创建对象。有静态方法用,为什么还需要创建对象来浪费内存呢?
$request = Request::instance(); echo '请求方法:' . $request->method() . '<br/>'; //上面先是创建对象,再调用方法。 有静态方法用,为什么还需要创建对象来浪费内存呢 Request::instance()->method();
java中也有很多静态方法,静态方法的好处就是你不用再为了调用方法而去创建对象。
2、tp连接数据库成功,两个基本的查询和写入操作也已经测试成功,明天会继续熟悉数据库的CRUD操作。
3、正如tp的一句签名【十年磨一剑-为API开发设计的高性能框架】,github上有很多基于tp写的app后台。明天除了学习数据库的操作,还有熟悉tp模型的使用。
2017/4/29
1、数据库的CRUD操作熟悉完成之后,接着进行模型的学习。也即是学着用model来操作数据表。具体如何用Model操作数据表,在tp5官方手册已经说得很详细了。
2、27号我说想多建设几个模块,老在index模块里写代码不好,项目结构不够清晰,所以我打算新建三个模块,model,controller,view。我如果要在index模块下的index类的index方法写下面这些代码,运行会出错。“致命错误: Class ‘StudentModel’ not found”,最后查明,是我命名空间没写对。
//这块咋测试都不成功。为甚么, 致命错误: Class 'StudentModel' not found $student2 = new \app\model\StudentModel(); $student2->name= 'di 2 ge '; $student2->number='222'; $student2->save();
3、上面的问题解决完后,我想把index模块去掉(或者我重构Index为controller),然后运行报错。
先上我的项目结构图
报错截图:
我很疑惑,localhost没错,提示找不到控制器index(没改之前index的路径是index/index/index),我只是将index.php从原来的index模块放到了controller模块,为什么就不行?
解决办法1:直接用路径localhost/controller/index/index 结果:失败
解决办法2:是不是哪个配置文件没改过来 实验成功)
猜想1:是不是控制器不能小写,已知大写能成功
实验结果:控制器名小写会出错,以后类名要大写
猜想2:类名和文件名不一致能不能访问成功?
实验结果:类名大写,文件名小写(名字不一样),失败。
猜想3:现在的命名空间是:namespace app\admin\controller;我去掉controller还能访问么?
实验结果:不行。命名空间必须完整,不完整会出现各种坑。上目录结构图
实验3:我能不能把admin模块也去掉?
实验结果:不能。
上图:
猜想4:我在上一个实验的基础上,在controller模块中又新建一个controller,上图
实验结果:成功。这说明,控制器一定要放在controller下,否则tp5认不出你。
4、小结
由于之前忽视了命名空间的作用,命名规则(开发规范),才会出现这么多问题。明天开始看github上APP后台。
2017/4/30
更新在学习《学习TP框架(二)》
- 学习TP框架(一)
- TP框架基础(一)
- 学习TP框架(二)
- tp框架的初始了解-------(一)
- php框架(CI,TP,LAVAREL,SWOOLE)源码学习之TP
- Android TP(一)
- Android TP(一)
- 继续摘抄:一步一步循序渐进学习TP一(新手篇)
- 一步一步循序渐进学习TP一(新手篇)
- TP框架学习笔记第一天
- TP框架学习笔记第二天
- TP框架学习笔记第三天
- TP框架学习笔记第四天
- TP框架
- TP框架
- TP框架----hook(钩子)的使用
- 支付宝接口代码(TP框架)
- TP框架基础介绍-----(二)
- UIButton 设置阴影效果
- 使用花生壳、路由器、个人电脑进行站点部署并实现外网域名访问图文详解(花生壳设置方法 使用方法 使用教程)
- sphinx 增量索引 实现近实时更新
- 学习笔记| AS入门(二) 简单控件篇(上)
- 线索二叉树(Threaded BinaryTree)
- 学习TP框架(一)
- AOJ-problem-849
- XeLatex在window上编译较慢的解决方法
- RockMongo 查询条件小结
- Java并发编程实战
- eclispse 中python 注释 颜色设置 背景设置
- 安卓工具类之获取屏幕高宽尺寸以及安卓中dp和px的转换
- HttpClient访问其他系统接口使用详解
- 欧拉函数学习笔记整理 POJ 2407+POJ 1284+POJ 2478+POJ 3090