第三周深入理解THinkPhp5.1

本文详细介绍了ThinkPhp5.1的Route路由技术,包括路由定义文件、基本语法、快捷方式、路由参数和控制器的使用方法。同时,探讨了tp51中的配置技巧,如配置类型、优先级、特点以及如何获取应用或模块配置参数。通过对控制器的命名规则、前置操作、命令行生成控制器和页面跳转的理解,加深对ThinkPhp5.1框架的掌握。

一、Route路由技术入门

1.路由定义文件

统一定义在route目录下,默认为route.php;
可以在该目录下设置多个路由文件,最终一起合并加载;
例如根据模块定义路由: route.php,index.php,admin.php,api.php…;
建议添加:use think\facade\Route;,不使用别名:Route,以获取IDE的代码提示;

2.路由定义的基本语法

Route::rule('路由表达式','路由地址','请求类型','路由参数','变量规则');
  1. 路由表达式: 用户输入的url地址,即自定义的路由规则;
  2. 路由地址: 实际转向的url地址;
  3. 请求类型: get/post/put/delete…,推荐直接使用快捷方法;
  4. 路由参数: 主要检测路由规则,推荐使用方法设置;
  5. 变量规则: url中的变量参数须遵守的规则,默认为:’\w+’,推荐使用方法设置;

3.路由定义的快捷方式

GET:
Route::get('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('get');
POST:
Route::post('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('post');
PUT:用于更新资源(不常用)
Route::put('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('put');
DELETE:用于删除资源(不常用)
Route::delete('路由表达式','路由地址');
Route::rule('路由表达式','路由地址')->method('delete');

4.路由表达式

静态表达式: 没有参数,例如: user;
动态表达式: 有参数,V5.1.6+ 推荐使用组合变量规则来定义;
user/hello: /分隔符可自定义,例如 user-hello 或者 user_hello都可以;
user/hello/<name>: ,<name>是必选变量;
user/hello/<name?>: <name?>是可选变量;

5.路由参数

路由参数很多,这里仅介绍几个常用的
method(): 请求类型;
ext(‘html’): url扩展名;
更多参数请访问: 路由参数
实例:

Route::rule('hello/<name?>', 'index/hello')
        ->method('get')     // 请求类型
        ->ext('html');      // url后缀

6.变量规则

方法: pattern()
参数说明:

单个变量规则可用字符串: pattern('name', '\w+');
多个变量规则可用数组: pattern(['name' => '\w+','id' => '\d']);

实例:

Route::rule('hello/<name?>', 'index/hello')
        ->pattern('name','[a-z]{2,5}$')     // 必须是小字字母且必须在2到5个之间
        ->method('get') // 请求类型
        ->ext('html');  // url后缀

7.别名路由

别名路由: 一条规则,批量对应一批路由地址;
别名路由: 通过只路由到控制器级别;
别名路由: 纯粹是为了缩短地址,注意与路由表达式的区别;

//可以用’p’,直接访问’index模块index控制器中的所有操作方法’
Route::alias(‘p’,‘index/index’);

8.URL生成

方法:

think\facade\Url::bild('地址表达式',['参数'],['URL后缀'],['域名'])

地址表达式: 与think\facade\Route::rule()中的路由地址保持一致;
默认生成的是: pathinfo 结构的 url地址;
配置项:‘url_common_param’=>true,则生成带查询字符串的url(参数以键值对方式提供)
例如:

 /index.php/blog/5.html?name=thinkphp;

二、 tp51中的配置技巧

1.配置的类型

惯例配置: 位于核心框架内,不要去修改它;
应用配置: 针对应用的全局配置;
模块配置: 针对应用中的某个模块进行配置;
动态配置: 针对当前请求有效,在控制器操作中设置,不会保存到配置文件中;

2.配置的优先级

惯例配置->应用配置->模块配置->动态配置`

3.tp5.1配置的特点

全部采用二级配置,配置文件名为一级配置,例如应用配置文件app.php,app就是一级配置名称,内部键值对为二级配置;
每个模块也可以有自己的配置目录,所以用户可设置:应用配置和模块配置;
惯例配置文件: thinkphp/convention.php;
应用配置目录: /config/config_file;
模块配置目录: application/module/config/config_file;
也可以在应用配置目录中接管模块中的配置:config/module/config_file;
模块中的配置的优先级大于应用配置目录中的模块配置;
配置参数严格区分大小写,建议参数全部使用小写字母+下划线

4.只允许在应用配置中设置的参数

app_debug: 应用调试模式(支持环境变量配置)
app_trace: 应用trace(支持环境变量配置)
class_suffix: 类后缀
default_filter: 默认过滤机制
root_namespace: 根命名空间
pathinfo_depr: PATH_INFO分隔符
url_route_must: 路由强制模式
auto_bind_module: 自动绑定模块
default_lang: 默认语言
lang_switch_on: 多语言切换

5.只允许在环境变量中设置的参数

.env是环境变量配置文件,用来模拟环境变量,必须与application目录平级,即位于应用的根目录下面;
.env中的配置项优先级大于框架应用配置,一定要注意;
.env默认采用ini格式,例如:
有些配置仅允许在.env中设置
APP_NAMESPACE: 应用命名空间;
CONFIG_EXT: 配置文件后缀;
有一些应用配置项,强烈推荐设置在.env配置文件中;
常用的.env文件内容结构:

 APP_DEBUG = true  # 调试开关:
    APP_TRACE = true  # 跟踪器开关
    [DATABASE]        # 二级配置: 例如数据库配置     
    USERNAME =  root  # 数据库用户名
    PASSWORD =  123456 # 用户密码

6.如果获取应用或模块配置参数?

类:

think\Config: 使用框架配置类;
think\facade\Config 或者别名 Config: 框架预定义的门面配置类(静态代理)或别名;
类方法:

pull(): 获取一级配置项;
has('一级配置.配置项'): 判断配置项是否存在;
get('一级配置.配置项'): 获取配置项,省略一级配置则获取它下面全部的配置顶;
set('一级配置.配置项','新值'): 设置配置顶;
助手函数: config(),无须引入Config,任何时候都可以直接使用,可能不会得到IDE的代码提示

在index模块中新建控制器:Demo1.php,用来学习配置相关的操作

7.实例演示: application/controller/Demo1.php

<?php 

namespace app\index\controller;

use think\Config;   //使用facade,必须将原始类空间引用语句注释掉
// use think\facade\Config; // 推荐使用门面代理
// 使用 think/facade/Config 的别名,来简化代码
// use Config;

use think\facade\Env;

class Demo1 
{
    // 将配置对象,以'依赖注入'的方式,通过参数注入到类方法中
    function conf1(Config $config)
    {
        // has('一级配置名称.配置项'):判断是否存在指定配置项
        // pull('一级配置名称'): 获取一级配置项
        // get('一级配置名称.配置项'):获取配置项
        // set('一级配置名称.配置项'):设置配置项
        
        //查看默认返回的数据类型
        //判断是否存在该配置项
        if ($config->has('app.default_return_type')) {
            dump($config->get('app.default_return_type'));
        }
        
        dump($config->get('app_debug'));  // 'app_debug'在.env中设置,使用Env类获取,这里获取不到

        //动态设置该配置项
        $config->set('app.default_return_type','json');
        dump($config->get('app.default_return_type'));
        

        //获取一级配置项,例如:app.php
        dump($config->pull('app'));

        //get()方法省略配置项也可以获取一级配置
        dump($config->get('app.')); // 注意一级配置名称后面的'.'不可以省略
    }

    //使用Config的门面静态代理
    function conf2()
    {
        // 判断是否存在配置项
        if (Config::has('app.default_return_type')) {
            // 查询配置项
            dump(Config::get('app.default_return_type'));
        }
        
        //设置配置项
        Config::set('app.default_return_type','json');
        dump(Config::get('app.default_return_type'));

        //获取一级配置项
        dump(Config::pull('app'));
        dump(Config::get('app.'));

        //get()不传参,获取到所有的配置项
        dump(Config::get());
    }

    //使用助手函数config(),可以将前面的 use 语句全部注释掉
    function conf3()
    {
        // 判断是否存在某配置项
        if (config('?app.default_return_type')) {
            // 获取配置顶
            dump(config('app.default_return_type'));
        }

        //设置配置项
        config('app.default_return_type','json');
        dump(config('app.default_return_type'));

        //获取一级配置项
        dump(config('app.'));
        //获取所有的配置项
        dump(config());

    }

    function conf4()
    {
        // 环境变量获取时,配置名称不区分大小写
        dump(Env::get('app_debug'));
        dump(Env::get('database.username'));
    }

}

三、tp51控制器Controller的使用方法

1.涉及控制器的配置项

应用配置文件(app.php);

// 默认的访问控制器层
'url_controller_layer'   => 'controller',
// 默认模块名
'default_module'         => 'index',
// 禁止访问模块
'deny_module_list'       => ['common'],
// 默认控制器名
'default_controller'     => 'Index',
// 默认操作名
'default_action'         => 'index',

例如: application/index/controller/Index.php;
如果修改了controller目录名,则不能访问Index.php;

2.控制器命名规则

控制器是类文件,每个单词首字母必须大写,User;
url中忽略控制器名称大小写,多个单词之间用下划线进行连接,user_controller;
完整的控制器类名应该带有命名空间: app\index\controller\User;

3.控制器使用的注意事项

可以通过URL访问的控制器操作的访问属性必须是:public;
控制器的命名空间必须是:app根空间开始,如果想修改,必须在.env中设置;
APP_NAMESPACE = application;
控制器不依赖于基类think\Controller,推荐继承它,这样可以使用一些预置的属性和方法;

4.控制器前置操作

前置操作: 当前操作执行前,必须先执行的操作;控制器必须继承:think\Controller;
设置属性: protected $beforeActionList = […];;
属性数组键名: 前置操作方法名称;
属性数组键值:
空: 该操作是所有操作的前置操作;
[‘only’=>‘a,b’]: 所有操作中,仅有a 和 b 需要执行前置操作
演示代码:

<?php 
namespace app\index\controller;

use think\Controller;

class Demo2 extends Controller
{
    protected $beforeActionList = [
        'a',
        'b' => ['except' => 'x,y'],
        'c' => ['only' => 'x']
    ];

    // 设置三个前置操作: a,b,c
    public function a()
    {
        echo '前置操作 a' . '<br>';
    }

    public function b()
    {
        echo '前置操作 b'. '<br>';
    }

    public function c()
    {
        echo '前置操作 c'. '<br>';
    }

    public function x()
    {
        return '操作 x';
    }

    public function y()
    {
        return '操作 y';
    }
}

执行x操作: http://tp51.io/index/demo2/x
经过分析,x的前置是a,c,b被排除
前置操作 a
前置操作 c
操作 x
执行y操作:http://tp51.io/index/demo2/y
经过分析: 只会执行前置操作 a
前置操作 a
操作 y

5.使用命令行生成控制器:

必须先切换到当前项目目录下面: tp51 ;
命令: php think make:controller index/Demo3
解释: 在index模块下面创建Demo3控制器
生成的控制器以及内部的预置代码如下:

<?php

namespace app\index\controller;

use think\Controller;
use think\Request;

class Demo3 extends Controller
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        //
    }

    /**
     * 显示创建资源表单页.
     *
     * @return \think\Response
     */
    public function create()
    {
        //
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        //
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        //
    }

    /**
     * 显示编辑资源表单页.
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        //
    }
}

6.页面跳转与重定向:

控制器必须继承:think\Controller;
跳转内置方法:
$this->success(‘提示信息’,‘跳转地址’,‘等待时间’): 成功跳转,默认为$_SERVER[“HTTP_REFERER”];
$this->erroe(‘提示信息’,‘跳转地址’,‘等待时间’): 成功跳转,默认为javascript:history.back(-1);
等待时间默认为3秒,可以自定义;
跳转页面模板都一样: thinkphp/tpl/dispatch_jump.tpl

应用配置中可以改变默认的模板:

//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => '../application/tpl/dispatch_jump.tpl',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => '../application/tpl/dispatch_jump.tpl',
也可以使用项目内部的模板文件
//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => 'public/error',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => 'public/success',
重定向: $this->redirect('重定向的地址表达式', '重定向类型')
重定向地址: 与路由表达式中的路由地址对应;
重定向类型:
301: 永久重定向,不常用
302: 临时重定向,最常用
redirect('http://thinkphp.cn/blog/2',302);
//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);

// 可以在重定向的时候通过session闪存数据传值,例如
$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值