ThinkPHP5.0 学习笔记

跟着视频做的笔记,不一定工整,根据目录查看比较合适
本来打算跟着视频学,但是视频课程太多,讲的很详细,不过最后还是边做边参考文档,好在之前有写过.NET和JAVA,一些东西知道怎么查文档,而且TP5是中文的文档所以也不吃力
用TP5做了一个电商项目 GitHub源码

开启调试模式

application\config.php文件
// 应用调试模式
'app_debug' => true,
开始调试模式后不会隐藏错误报告

控制器

  • 控制器的文件名必须首字母大写
  • 控制中必须声明命名空间
    与目录有关,app\模块名\controller
  • 控制器中类名必须与文件名一致

新建方法(操作)

在控制器中新建方法

模型(model)

与数据库相关的方法

新建后台模块

  1. 在application目录下新建admin目录
  2. 在admin目录下新建mode、view、controller目录
  3. 在controller目录新建Index.php文件
  4. 在文件中Index控制器中书写代码
<?php
    //声明命名空间    
    namespace app\admin\controller
    //声明控制器
    class Index{
        public function index(){
           /* code */
        }
    }
  1. 通过地址栏访问 localhost/tp5/index.php/Admin/Index/index

调用当前控制器的方法

public test(){
    return "我是test方法";
}

public fun(){
echo $this->test();

echo $self::test();

echo 当前控制器名::test();

//系统方法
echo action('test');
}

跨控制器调用方法

调用当前模块的方法
控制器中新建方法 “diaoyong”

public function diaoyong(){
    // 不使用use
    $model = new \app\模块名\controller\控制器名(类名);
    echo $model->方法名();

    // 使用use  声明 `use \app\模块名\controller\控制器名(类名);`
    $model = new 控制器名(类名);
    echo $model->方法名();

    // 使用controller系统方法
    $model = controller('控制器名(类名)');
    echo $model->方法名();

    // 使用action系统方法
    echo action('控制器名/方法名')
}

调用后台(其他)模块的方法
控制器中新建方法 “diaoyongs”

public function diaoyong(){
    // 不使用use
    $model = new \app\模块名\controller\控制器名(类名);
    echo $model->方法名();

    // 使用use  声明 `use \app\模块名\controller\控制器名(类名);`
    // 控制器重名时 使用别名 `use \app\模块名\controller\控制器名(类名) as OtherName`; 
    $model = new OtherName();
    echo $model->方法名();

    // 使用controller系统方法

    $model = controller('模块名/控制器名(类名)');
    echo $model->方法名();

    // 使用action系统方法
    echo action('模块名/控制器名/方法名')
}

系统方法一般位于 thinkphp\helper.php 中

TP大致执行流程

  1. 入口文件 (public\index.php)
    1. 定义目录常量
    2. 加载框架的引导目录 (thinkphp\start.php)
      1. 加载框架的基础引导文件 (thinkphp\base.php)
        1. 加载系统常量
        2. 引入loader类 (thinkphp\library\think\Loader.php)
        3. 引入环境变量
        4. 注册自动加载机制 (thinkphp\library\think\Loader.php)
        5. 注册异常处理机制 (thinkphp\library\think\Error.php)
        6. 加载惯例配置 (thinkphp\convention.php)
      2. 运行应用 (thinkphp\library\think\App.php) 的run方法
        1. 加载当前控制器中的 initCommon() 方法
          1. 加载当前控制器中的 init()
            1. 加载各种配置文件
            2. 加载公共文件
            3. 加载语言包
          2. 设置时区
        2. 加载当前控制器 routeCheck() 方法路由检测
        3. 调用当前控制器中的 exec() 方法
          1. 根据用户的请求,进行分发处理
          2. 根据不同请求类型加载对应文件,当前情况为module,执行module方法
            1. module中加载对应控制器和对应方法
        4. 输出数据到客户端
          1. 用户看到的所有界面就加载出来了

TP5.0 配置

配置文件格式

  1. ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式。
  2. 对于数组形式,形如
    return [
        'name'      =>'',
        'age'       =>'',
        'people'    =>  [
            'name'  =>'',
            'age'   =>'',
            'sex'   =>'',
        ],
    ];

配置的形式

  1. 惯例配置 (thinkphp\convention.php)
    一般不要修改惯例配置
  2. 应用配置 (application\config.php)
  3. 扩展配置

    1. 是对配置文件进行分目录的管理
    2. 默认两个扩展配置
      (application\database.php) 数据库配置文件
      (application\extra) 用户可以自定义配置文件
    3. 读取database扩展配置
      dump(config('database.password'));
      读取所有database配置
      dump(config('database'));
    4. 自定义扩展配置
      在扩展目录下 (application\extra) 新建user.php

      <?php
      return [
          "name"=>"",
          "age"=>"",
          "love"=>"",
      ];
  4. 场景配置

    1. 解决问题
      开发过程可能不同环境下进行开发
    2. 如何使用
      1. 修改应用配置 (application\config.php)
        ‘app_status’ => ‘home’,
      2. 在应用目录下新建 (application) home.php
      3. 在home.php编写配置
      4. 读取场景配置
  5. 模块配置

    1. 解决问题
      每个模块,都具有特有的配置
    2. 如何使用(以前台模块为例)
      1. 在前台模块下 (application\index) 新建config.php
      2. 编辑文件
      3. 读取配置
        php
        dump(config('index'));
  6. 动态配置
    在控制器中的临时配置

    ...
    //控制器体
    public function setConfig(){
        dump(config('name'));   // 先观察目前值
    
        //系统方法
        //参数1: 字段名 参数2: 值
        config('name','tp5');
    
        //系统类
        \think\Config::set('name','php');
        //或者使用use \think\Config
        Config::set('name','TP5php');
        echo Config::get('name');
    }
    //控制器体
    ...

读取配置文件

public function getConfig(){
    // 通过系统方法
    echo config('配置字段名');
    // 打印所有配置
    dump(config());

    // 通过系统类
    // 可以使用命名空间
    // 如果配置项不存在,则返回NULL
    echo \think\Config::get('字段名');

    // 使用use
    use \think\Config;
    echo Config::get('字段名');
}

读取数组配置则将字段名改为 数组名.字段名

配置文件之间优先级

动态配置>模块配置>场景配置>扩展配置>应用配置>惯例配置
则配置文件加载顺序为优先级从低到高
后加载的配置,对加载过的配置进行同名覆盖

环境变量配置

  1. TP5.0 才支持环境变量配置
  2. 设置环境变量配置

    1. 打开网站根目录(项目根目录) 新建 “.env” 文件(windows 下无法直接创建,可通过编辑器创建)
    2. 书写环境配置(不支持中文字符)

      name = lazyslepp
      age = 8
      sex = man
      
      // 定义数组类型
      [mydatabase]
      type = mysql
      root = root
      pass = pass
    3. 读取环境变量

      // 系统类
      dump(\think\Env::get('name'));
      // use \think\Env
      // 可以给定默认值
      dump(Env::get('other''找不到'));
      // 读取数组
      dump(Env::get('mydatabase.type'));
      dump(Env::get('mydatabase.root'));
      // 不可以直接读取数组
      // 如:
      // dump(Env::get('mydatabase'));
    4. 何时使用?在任意配置文件中

      use \think\Env;
      return [
          // 其他
          app_debug       =>  Env::get('app_debug',false),
          // 其他
      ];

    这样可以将常常需要修改的配置,放入环境变量中统一修改,不需要每次打开各种配置文件修改配置

入口文件和路由优化

路由作用

  1. 简化URL地址
  2. 利于搜索引擎发现

入口文件

前后台分离(新建入口文件)

在public路径下复制粘贴index.php文件并更名为admin.php

绑定模块
  1. 实现功能
    • index.php 这个入口文件 只能去前台模块
    • admin.php 这个入口文件 只能去后台模块
  2. 如何实现
    在入口文件中的加载框架引导文件之前
    绑定前台模块
    define("BIND_MODULE","index")
    绑定后台模块
    define("BIND_MODULE","admin")
  3. URL地址变化

    1. 绑定前
      localhost/…/public/index.php/模块/控制器/方法
    2. 绑定后
      localhost/…/public/index.php/控制器/方法

    建议后台入口模块名复杂,防止一部分用户误打开

隐藏入口文件
  1. 开启apache的重写 (httpd.conf)
    去除注释
    LoadModule rewrite_module modules/mod_rewrite.so
  2. 设置访问权限
    AllowOverride All
  3. 入口文件,在网站public目录下新建.htaccesss

    <IfModule mod_rewrite.c>
        Options +FollowSymlinks -Multiviews
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    </IfModule>

    代码中倒数第二行配置了默认添加index.php,因此默认访问前台

  4. URL地址变化 (仅前台)
    1. 隐藏前
      localhost/…/public/index.php/控制器/方法
    2. 隐藏后
      localhost/…/public/控制器/方法

TP5.0 路由需要注意的

  1. 支持三种路由规则
  2. 路由只针对应用,不针对模块,因此路由的设置也是针对应用下面的所有模块
  3. 关闭模块路由
    在需要关闭的模块的入口文件后面加 \think\App::route(false);
    必须写在 加载框架引导文件之后

路由模式

普通模式
  1. 定义
    关闭路由,完全使用默认的 PATH_INFO 方式URL
  2. 形式
    localhost/…/public/index.php/控制器/方法
  3. 设置方法 (application\config.php)
// 是否开启路由
'url_route_on'           => false,
// 是否强制使用路由
'url_route_must'         => false,
混合模式
  1. 定义
    开启路由,并使用路由定义+默认的 PATH_INFO 方式的混合
  2. 设置方法 (application\config.php)
// 是否开启路由
'url_route_on'           => true,
// 是否强制使用路由
'url_route_must'         => false,
强制模式
  1. 定义
    开启路由,并设置必须定义路由才能访问
  2. 设置方法 (application\config.php)
// 是否开启路由
'url_route_on'           => true,
// 是否强制使用路由
'url_route_must'         => true,

设置路由 (application\route.php)

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

动态单个注册
  1. 设置路由文件 (application\route.php) 编辑内容

    // 引入系统类
    use think\Route;
    // 定义路由规则
    // 设置路由之后就不可以使用PATH_INFO访问
    // 注册路由 访问到Index模块index控制器index方法
    Route::rule('/','index/index/index');
    // 注册路由 访问到Index模块index控制器test方法
    Route::rule('test','index/index/test');
  2. 路由的形式

    1. 静态地址路由
      注册路由test 访问到Index模块index控制器test方法
      Route::rule('test','index/index/test');
    2. 带参数的路由
      注册带参数路由
      localhost/…/public/couser/1
      localhost/…/public/index/index/index/1
      Route::rule('course/:id','index/index/course');
      在course方法中
      echo input('id');

      如果路由设置两个参数,必须带两个参数
      localhost/…/public/time/2018/5
      Route::rule('time/:year/:month','index/index/mytime');
      可选参数则可写为
      Route::rule('time/:year/[:month]','index/index/mytime');
      在mytime方法中
      echo input('year')." ".input('month');

      全动态路由 (不建议使用)
      若动态参数与之前设置的匹配则优先匹配之前设置的路由
      Route::rule(':a/:b','index/index/dongtai');

      完全匹配路由,加$符号
      localhost/…/public/test1 可以成功访问
      localhost/…/public/test1/other/other 不能访问
      Route::rule('test1$','index/index/test1');

      带额外参数
      localhost/…/public/test2 访问时则get了id和name参数
      可以在方法中通过打印input()查看
      Route::rule('test2','index/index/test2?id=10&name=lazysleep');

    3. 设置请求类型

      1. TP中请求类型
        GET POST PUT DELETE
      2. 设置路由请求方式
        默认支持所有请求类型
        设置只能通过get请求
        Route::rule('type','index/index/type','GET');
        or
        Route::get('type','index/index/type');

        同时支持get post
        Route::rule('type','index/index/type','GET|POST');
        or
        Route::get('type','index/index/type');
        Route::post('type','index/index/type');

        支持所有
        Route::rule('type','index/index/type','*');
        or
        Route::any('type','index/index/type');

动态批量注册
Route::rule([
    "test"=>"index/index/index",
    "course/:id"=>"index/index/course"
],'','GET');

or

`Route::get([
    "test"=>"index/index/index",
    "course/:id"=>"index/index/course"
]);`
配置文件批量注册

直接返回数组 (application\route.php)

return [
    "test"=>"index/index/index",
    "course/:id"=>"index/index/course"
];
变量规则

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

id用正则表达式限定为数字
Route::rule("course/:id","index/index/course",'GET',[],['id'=>'\d{1,3}']);

路由参数

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

参数说明
method请求类型检测,支持多个请求类型
extURL后缀检测,支持匹配多个后缀
deny_extURL禁止后缀检测,支持匹配多个后缀
https检测是否https请求
domain域名检测
before_behavior前置行为(检测)
after_behavior后置行为(执行)
callback自定义检测方法
merge_extra_vars合并额外参数
bind_model绑定模型( V5.0.1+ )
cache请求缓存( V5.0.1+ )
param_depr路由参数分隔符( V5.0.2+ )
ajaxAjax检测( V5.0.2+ )
pjaxPjax检测( V5.0.2+ )

V5.0.3+ 版本对 ajax / pjax / https 条件支持 false 。

这些路由参数可以混合使用,只要有任何一条参数检查不通过,当前路由就不会生效,继续检测后面 的路由规则。

eg:
请求方式必须是GET
后缀必须是html
Route::rule("course/:id","index/index/course",'GET',['method'=>"GET","ext"=>"html"]);

资源路由

声明方式
Route::resource('blog','index/blog');

声明资源路由后会自动生成七个路由 增删改查等等

标识请求类型生成路由规则对应操作方法(默认)
indexGETblogindex
createGETblog/createcreate
savePUTblogblog/:id
readGETblog/:idread
editGETblog/:id/editedit
updatePUTblog/:idupdate
deleteDELETEblog/:iddelete

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

eg:

namespace app\index\controller; 
class Blog {
    public function index(){ 

    }
    public function read($id){ 

    }
    public function edit($id){ 

    }
}

快捷路由

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

namespace app\index\controller; 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

URL生成

语法
think\Url::build('index/index/test');
or use think\Url
Url::build('index/index/test');
Url('index/index/test');
若使用了路由则返回路由的Url

带参数的url
url('index/index/test',['id'=>10,'name'=>"张三"]);

控制器初始化

创建的注意事项

  • 控制器名字首字母大写,驼峰命名法
  • 控制器名字和文件名相同
  • 命名空间必须和文件名对应
    eg:
    namespace app\index\controller
    Path\application\index\controller
  • 控制器名字采用驼峰命名时,如 UserInfo.php
    则url应为localhost/…/public/Index/user_info/index

控制器如何加载页面

  1. 系统View类

    $view = new \think\View;
    return  $view->fetch();
  2. 系统Controller类
    use think\Controller;
    类继承Controller
    方法中 return $this->fetch();

  3. 系统函数 return View();

数据输出

  1. 输出字符串
    直接return 字符串;
  2. 输出数组
    转换成字符串(JSON字符串)
  3. 返回html代码

控制器初始化方法

控制器类中继承系统控制器Controller
实现方法 public function _initialize() 在调用任意控制器方法时会自动调用初始化方法

控制器前置方法

定义属性$beforeActionList

namespace app\index\controller;

use think\Controller;

class Index extends Controller
{
    /*
    ['except' => '方法名,方法名']
    表示这些方法不使用前置方法,

    ['only' => '方法名,方法名']
    表示只有这些方法使用前置方法。
    */
    protected $beforeActionList = [
        'first',
        'second' =>  ['except'=>'hello'],
        'three'  =>  ['only'=>'hello,data'],
    ];

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

页面跳转

在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\think\Controller类内置了两个跳转方法success和error,用于页面跳转提示。

使用方法很简单,举例如下:

namespace app\index\controller;

use think\Controller;
use app\index\model\User;

class Index extends Controller
{
    public function index()
    {
        $User = new User; //实例化User对象
        $result = $User->save($data); 
        if($result){
            //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
            $this->success('新增成功', 'User/list');
        } else {
            //错误页面的默认跳转页面是返回前一页,通常不需要设置
            $this->error('新增失败');
        }
    }
}

跳转地址是可选的,success方法的默认跳转地址是$_SERVER[“HTTP_REFERER”],error方法的默认跳转地址是javascript:history.back(-1);。

修改跳转页面模板

模板文件位于thinkphp\tpl\dispatch_jump.tpl
会传入文件几个变量

变量含义
$data要返回的数据
$msg页面提示信息
$code返回的code,成功返回1,失败返回0
$wait跳转等待时间单位为秒
$url跳转页面地址

页面重定向

$this->redirect(‘News/category’);

空控制器空操作

参考TP5.0 文档

数据库

采用PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。

数据库配置

通过配置文件
application\database.php文件

    // 数据库类型
    'type'            => 'mysql',
    // 服务器地址
    'hostname'        => '127.0.0.1',
    // 数据库名
    'database'        => 'phpdb',
    // 用户名
    'username'        => 'root',
    // 密码
    'password'        => '123456',
    // 端口
    'hostport'        => '3306',

其余方法查阅文档

构造器

增删改查方法
文档查阅

友好的变量输出dump方法

     /**
     * 浏览器友好的变量输出
     * @param mixed     $var 变量
     * @param boolean   $echo 是否输出 默认为true 如果为false 则返回输出字符串
     * @param string    $label 标签 默认为空
     * @return void|string
     */
    function dump($var, $echo = true, $label = null)
    {
        return Debug::dump($var, $echo, $label);
    }

TP5文档

https://www.kancloud.cn/manual/thinkphp5/118003

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值