学习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';    }}

小结:

  1. 入口文件中不应该包含过多代码(就像安卓Activity中不适合写过多的代码),所以应该将代码拆分,还index.php一个清爽的样子。解决办法:新增文件(入口文件),新建文件夹(创建模块)
  2. 每次测试入口文件中的操作(成员函数)时候,必须输入一大串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框架(二)》

0 0
原创粉丝点击