• Thinkphp5学习笔记


    Thinkphp5学习笔记

    架构

    Thinkphp5目录架构

    thinkphp  应用部署目录
    ├─application           应用目录(可设置)
    │  ├─common             公共模块目录(可更改)
    │  ├─index              模块目录(可更改)
    │  │  ├─config.php      模块配置文件
    │  │  ├─common.php      模块函数文件
    │  │  ├─controller      控制器目录
    │  │  ├─model           模型目录
    │  │  ├─view            视图目录
    │  │  └─ ...            更多类库目录
    │  ├─command.php        命令行工具配置文件
    │  ├─common.php         应用公共(函数)文件
    │  ├─config.php         应用(公共)配置文件
    │  ├─database.php       数据库配置文件
    │  ├─tags.php           应用行为扩展定义文件
    │  └─route.php          路由配置文件
    ├─extend                扩展类库目录(可定义)
    ├─public                WEB 部署目录(对外访问目录)
    │  ├─static             静态资源存放目录(css,js,image)
    │  ├─index.php          应用入口文件
    │  ├─router.php         快速测试文件
    │  └─.htaccess          用于 apache 的重写
    ├─runtime               应用的运行时目录(可写,可设置)
    ├─vendor                第三方类库目录(Composer)
    ├─thinkphp              框架系统目录
    │  ├─lang               语言包目录
    │  ├─library            框架核心类库目录
    │  │  ├─think           Think 类库包目录
    │  │  └─traits          系统 Traits 目录
    │  ├─tpl                系统模板目录
    │  ├─.htaccess          用于 apache 的重写
    │  ├─.travis.yml        CI 定义文件
    │  ├─base.php           基础定义文件
    │  ├─composer.json      composer 定义文件
    │  ├─console.php        控制台入口文件
    │  ├─convention.php     惯例配置文件
    │  ├─helper.php         助手函数文件(可选)
    │  ├─LICENSE.txt        授权说明文件
    │  ├─phpunit.xml        单元测试配置文件
    │  ├─README.md          README 文件
    │  └─start.php          框架引导文件
    ├─build.php             自动生成定义文件(参考)
    ├─composer.json         composer 定义文件
    ├─LICENSE.txt           授权说明文件
    ├─README.md             README 文件
    ├─think                 命令行入口文件
    

    规范

    ​ ThinkPHP5.0的URl访问受路由决定,如果关闭路由或者没有匹配路由的情况下,则是基于:

    http://serverName/index.php(或者其他应用入口文件,可省略) /模块/ 控制器/操作 / 参数 /值

    ​ 在Thinkphp5.0框架中,在url地址栏里面如果不写模块、控制器和操作名,默认访问的就是index模块下面的index控制器下面的index操作,可以在config.php文件中进行修改。

    入口文件

    ​ 用户请求的PHP文件,负责处理一个请求(注意,不一定是URL请求)的生命周期,最常见的入口文件就是index.php, 有时候也会为了某些特殊的需求而增加新的入口文件,例如给后台模块单独设置的一个入口文件admin.php或者一个控制器程序入口think都属于入口文件。

    命名空间规范

    应用类库的根命名空间统一为app(可以设置app_namespace配置参数更改);
    例如:appindexcontrollerIndex 和 appindexmodelUser;

    属性命名

    • 类的命名采用驼峰法,并且首字母大写,例如User、UserType,默认不需要添加后缀,例如UserController应该直接命名为User;
    • 在Thinkphp3中需要UserController等命名方式;
    • 函数的命名使用小写和下划线(小写字母开头的方式),例如get_client_ip ;
    • 方法的命名使用驼峰法,并且首字母小写,例如getUserName ;
    • 属性的命名使用驼峰法,并且首字母小写,例如tableName 、 instance;

    应用类库命名空间规范

    应用类库的根命名空间统一为app(可以设置app_namespace配置参数更改);
    例如:appindexcontrollerIndex 和 appindexmodelUser;

    请求

    Thinkphp助手参数

    1.判断变量是否定义

    input('?get.id');
    input('?post.name');
    

    变量类型方法:

    方法 描述
    param 获取当前请求的变量
    get 获取 $_GET 变量
    post 获取 $_POST 变量
    put 获取 $_PUT 变量
    delete 获取 $_DELETE 变量
    session 获取 $_SESSION 变量
    cookie 获取 $_COOKIE 变量
    request 获取 $_REQUEST 变量
    server 获取 $_SERVER 变量
    env 获取 $_ENV 变量
    route 获取 路由(包括PATHINFO) 变量
    file 获取 $_FILE 变量

    获取PARAM参数

    input('param.name'); // 获取单个参数
    input('param.'); // 获取全部参数
    // 下面是等效的
    input('name'); 
    input('');
    

    获取GET参数

    // 获取单个变量
    input('get.id');
    // 使用过滤方法获取 默认为空字符串
    input('get.name');
    // 获取全部变量
    input('get.');
    

    使用过滤方法

    input('get.name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤
    input('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤
    input('post.name','','orgFilter::safeHtml'); // 获取post变量 并用orgFilter类的safeHtml方法过滤
    

    使用变量修饰符

    input('get.id/d');
    input('post.name/s');
    input('post.ids/a');
    

    修饰符

    修饰符 作用
    s 强制转换为字符串类型
    d 强制转换为整形类型
    b 强制转换为布尔类型
    a 强制转换为数组类型
    f 强制转换为浮点类型

    请求

    Request对象的主要职责是统一和更安全地获取当前的请求信息,你需要避免直接操作$_GET、$_POST、$_REQUEST、$_SESSION、$_COOKIE、$_FILES等全局变量,而是统一使用Request对象提供的方法来获取请求变量。

    ​ ThinkPHP5的Request对象由thinkRequest类完成。

    $request = Request::instance();

    ​ 也可以使用助手函数

    $request = request();

    `$request = Request::instance();`
    // 获取当前域名
    `echo 'domain: ' . $request->domain() . '<br/>';`
    
    方法 描述
    param 获取当前请求的变量(自动识别GET、POST、PUT请求的一种变量获取方式,是系统推荐的获取请求参数方法)
    get 获取$_GET变量
    post 获取$_POST变量
    put 获取PUT变量
    delete 获取DELETE变量
    session 获取$_SESSION变量
    cookie 获取$_COOKIE变量
    request 获取$_REQUEST变量
    server 获取$_SERVER变量
    env 获取$_ENV变量
    file 获取$_FILES变量

    改变变量

    ​ 如果需要更改请求变量的值,可以通过下面的方式:

    ​ 更改GET变量

    Request::instance()->get(['id'=>10]);

    ​ 更改POST变量

    Request::instance()->post(['name'=>'thinkphp']);

    ​ 尽量避免直接修改$_GET或者$_POST 数据,同时也不能直接修改param变量,例如下面的操作是无效的。

    ​ 更改请求变量

    Request::instance()->param(['id'=>10]);

    伪静态

    ​ URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置url_html_suffix参数随意在URL的最后增加你想要的静态后缀,而不影响当前操作的正常执行。例如,我们设置

    'url_html_suffix'=>'shtml'

    如果要获取当前的伪静态后缀,可以使用Request对象的ext方法。

    路由

    路由功能由 hinkRoute类完成。

    由于ThinkPHP5.0默认采用的URL规则是:

    http://server/module/controller/action/param/value/.....

    路由的作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。

    路由模式

    ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:

    普通模式

    关闭路由,完全使用默认的PATH_INFO方式URL:

    url_route_on => false,

    路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO模式访问URL:

    http://serverName/index.php/module/controller/action/param/value/...

    混合模式

    开启路由,并使用路由定义+默认PATH_INFO方式的混合:

    'url_route_on' => true,

    'url_route_must' => false,

    该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其他的仍然按照第一种普通模式的PATH_INFO模式访问URL。

    强制模式

    开启路由,并设置必须定义路由才能访问:

    url_route_on => true,

    url_route_must => true,

    这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。

    首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!我们需要在route.php这个文件中配置路由,要使用官方的 use thinkRoute

    Route::get('/',function(){
    	return 'Hello,world!';
    });
    

    路由定义

    路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。

    动态注册

    路由定义采用 hinkRoute类的rule方法注册,通常是在应用的路由配置文件

    application/route.php进行注册,格式是:

    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

    use thinkRoute;
    // 注册路由到index模块的Index控制器的list操作
    Route::rule('new/:id','index/Index/list');
    

    我们访问:

    http://serverName/new/5

    会自动路由到:

    http://serverName/index/index/list/id/5

    ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。

    路由命名标识必须唯一,定义后可以用于URL的快速生成。

    可以在rule方法中指定请求类型,不指定的话默认为任何请求类型,例如:

    Route::rule('new/:id','News/update','POST'); 表示定义的路由规则在POST请求下才有效。注意:请求类型参数必须大写。

    请求类型包括: 类型
    GET GET请求
    POST POST请求
    PUT PUT请求
    DELETE DELETE请求
    * 任何请求类型

    系统提供了为不同的请求类型定义路由规则的简化方法,例如:

    Route::get('new/:id','News/read'); // 定义GET请求路由规则
    Route::post('new/:id','News/update'); // 定义POST请求路由规则
    Route::put('new/:id','News/update'); // 定义PUT请求路由规则
    Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
    Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
    

    如果要定义get和post请求支持的路由规则,也可以用:

    Route::rule('new/:id','News/read','GET|POST');

    也可以批量注册路由规则

    Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
    Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
    Route::post(['new/:id'=>'News/update','blog/:name'=>'Blog/detail']);
    

    注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测。

    定义路由配置文件

    除了支持动态注册,也可以直接在应用目录下面的route.php的最后通过返回数组的方式直接定义路由规则

    return [
        'new/:id' => 'News/read',
        'blog/:id' => ['Blog/update',['method' => 'post|put'], ['id' => 'd+']],
    ];
    

    路由动态注册和配置定义的方式可以并存。由于检测机制问题,动态注册的性能比路由配置要高一些,尤其是多种请求类型混合定义的时候。

    默认情况下,只会加载一个路由配置文件route.php,如果需要定义多个路由文件,可以修改route_config_file的配置参数,例如:

    定义路由配置文件(数组)
    'route_config_file' => ['route', 'route1', 'route2'],
    

    资源路由

    5.0支持设置RESTFul请求的资源路由,方式如下:

    Route::resource('blog','index/blog');

    或者在路由配置文件中使用__rest__添加资源路由定义:

    return [
        // 定义资源路由
        '__rest__'=>[
        // 指向index模块的blog控制器
        'blog'=>'index/blog',
    ],	
    

    设置过后会自动注册7个路由规则,如下:

    标识 请求类型 生成路由规则 对应操作方法(默认)
    index GET blog index
    create GET blog/create create
    save POST blog save
    read GET blog/:id read
    edit GET blog/:id/edit edit
    update PUT blog/:id update
    delete DELETE blog/:id delete

    具体指向的控制器由路由地址决定,例如上面的设置,会对应index模块的blog控制器,你只需要为Blog控制器创建以上对应的操作方法就可以支持下面的URL访问:

    http://serverName/blog/
    http://serverName/blog/128
    http://serverName/blog/28/edit
    

    Blog控制器中对应的方法如下:

    namespace appindexcontroller;
    class Blog 
    {
        public function index()
        {	
        	dump(index);
        }
        public function update($id)
        {
        	dump(update);
        }
        public function delete($id)
        {
        	dump(delete);
        }
    }
    

    快捷路由

    快捷路由允许你快速给控制器注册路由,并且针对不同的请求类型可以设置方法前缀

    // 给User控制器设置快捷路由
    Route::controller('user','index/User');
    

    User控制器定义如下:

    namespace appindexcontroller;
    class User 
    {
        public function getInfo()
        {
        }
        public function getPhone()
        {
        }
        public function postInfo()
        {
        }
        public function putInfo()
        {
        }	
        public function deleteInfo()
        {
        }
    }	
    

    我们可以通过下面的URL访问

    get http://localhost/user/info
    get http://localhost/user/phone
    post http://localhost/user/info
    put http://localhost/user/info
    delete http://localhost/user/info
    

    权限控制

    Base.php,需要鉴权继承该类即可

    <?php
    namespace appindexcontroller;
    use thinkController;
    use thinkRequest;
    class Base extends Controller
    {
    	//用来存放需要用户登录之后才能操作的方法的集合
    	protected $is_check_login = [''];
    	public function _initialize()
    	{
    		if (!$this->isLogin() && (in_array(Request::instance()->action(), $this->is_check_login)||$this->is_check_login[0]=='*')){
    			return $this->error('请先登录系统!','index/Index/login');
    		}
    	}
    	public function isLogin()
    	{
    		return session('?name');
    	}
    }
    

    GoodsController,进行所有方法鉴权

    <?php
    namespace appindexcontroller;
    use appindexcontrollerBase;
    class Goods extends Base
    {
    	protected $is_check_login = ['*'];
    	public function add()
    	{
    		echo '我想要购买商品';
    	}
    	public function edit()
    	{
    		echo '我想退货';
    	}
    	public function delete()
    	{
    		echo '我不想买了';
    	}
    
    }
    

    CommentController,仅对Add方法路由鉴权

    <?php
    namespace appindexcontroller;
    use appindexcontrollerBase;
    class Comment extends Base
    {
    	protected $is_check_login = ['add'];
    	public function add()
    	{
    		echo '我想发表评论';
    	}
    	public function edit()
    	{
    		echo '我想编辑一下自己的评论';
    	}
    
    
    }
    
  • 相关阅读:
    SpringBoot+Vue实现指定账号审批单据时前端进行语音播报
    Jquery中使用JsonP加载本地json文件解决跨域问题
    Android中WebView加载sdcard中的html显示
    Android中WebView加载sdcard中的html时提示:ERR_FILE_NOT_FOUND和ERR_ACCESS_DENIED
    【20220302】育己人
    保序回归问题学习笔记
    可持久化数据结构学习笔记
    WC2022 打不过去年记
    Solution Set 「LOCAL」冲刺省选 Round XI
    Solution Set 「LOCAL」冲刺省选 Round XII
  • 原文地址:https://www.cnblogs.com/nice0e3/p/15242077.html
Copyright © 2020-2023  润新知