学习TP框架(一)

前言:

初次接触TP5,所以只能一边翻tp手册,熟悉基本用法,同时在app开发后台路上,继续往前拱一点。不做技术半吊子(不知其所以然),从我做起!!^_^

练习代码:

201717/4/27

<?php
namespace 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
V6.0.7版本发布,本版本主要针对上个版本做了一些路由修正,还意外收获了一些性能提升,是一个建议更新的版本。主要更新 修正Validate类的PHP8兼容性 改进redis驱动的append方法 修正路由匹配检测问题 优化路由变量正则规则生成 改进responseView的内容渲染 安装和更新 V6版本开始仅支持Composer安装及更新,支持上个版本的无缝更新,直接使用composer update 更新到最新版本即可。如果需要全新安装,使用:composer create-project topthink/think tpThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。全面的WEB开发特性支持最新的ThinkPHP为WEB应用开发提供了强有力的支持,这些支持包括:MVC支持-基于多层模型(M)、视图(V)、控制器(C)的设计模式ORM支持-提供了全功能和高性能的ORM支持,支持大部分数据库模板引擎支持-内置了高性能的基于标签库和XML标签的编译型模板引擎RESTFul支持-通过REST控制器扩展提供了RESTFul支持,为你打造全新的URL设计和访问体验云平台支持-提供了对新浪SAE平台和百度BAE平台的强力支持,具备“横跨性”和“平滑性”,支持本地化开发和调试以及部署切换,让你轻松过渡,打造全新的开发体验。CLI支持-支持基于命令行的应用开发RPC支持-提供包括PHPRpc、HProse、jsonRPC和Yar在内远程调用解决方案MongoDb支持-提供NoSQL的支持缓存支持-提供了包括文件、数据库、Memcache、Xcache、Redis等多种类型的缓存支持安全性框架在系统层面提供了众多的安全特性,确保你的网站和产品安全无忧。这些特性包括:XSS安全防护表单自动验证强制数据类型转换输入数据过滤表单令牌验证防SQL注入图像上传检测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值