TP5基础

一、基础

  • 1、官网安装TP5 http://www.thinkphp.cn/down/framework.html 还可以通过Composer和GIT安装
  • 2、目录结构

project 应用部署目录
├─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 命令行入口文件

  • 3、入口文件
    默认自带的入口文件位于public/index.php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
  • 4、资源访问
    访问资源问件是不会影响正常的操作访问,只有当资源不存在时才会解析到入口问件,一般提示模块不存在。
    资源文件一般放在public目录的子目录下,不要在public目录外的任何位置放置资源文件。

public
├─index.php 应用入口文件
├─static 静态资源目录
│ ├─css 样式目录
│ ├─js 脚本目录
│ └─img 图像目录

  • 5、控制器
    当访问一个驼峰命名的控制器时,在url中输入大写的控制器名称会报错,因为默认的URL访问是不区分大小写的,全部都会转换为小写的控制器名。
 false
//通过在url中添加参数来为控制器中的操作方法传递参数http://http://localhost/public/?name=php

如果控制器命名方式是驼峰的,在进行访问时必须改为小写;如果控制器中的操作方法是private和protect类型时,无法直接通过url访问到该操作。

  • 6、视图
    在给控制器添加视图文件功能时,首先在该模块下创建view目录,然后添加模板文件view/inde/hello.html


hello {$name}


    hello, {$name}!


在控制器方法中进行模板渲染输出操作

assign('name', $name);
        return $this->fetch();
    }
}

用use导入类库,Index可以直接继承,并直接使用封装好的assign和fetch方法进行模板变量赋值和渲染输出。

二、URL和路由

  • 1、参数传入
    以hello方法为例,可以直接在url中添加参数
http://tp5.com/index.php/index/index/hello/name/thinkphp

当需要传入两个参数时,继续在url中添加参数,可以有两种方式

http://tp5.com/index.php/index/index/hello/name/thinkphp/city/shanghai
http://tp5.com/index.php/index/index/hello?city=shanghai&name=thinkphp

还可以进一步对URL地址做简化,前提就是我们必须明确参数的顺序代表的变量,我们更改下URL参数的获取方式,把应用配置文件中的“url_param_type=>1”,此时必须严格按照参数的顺序进行添加。

  • 2、定义路由
    在application/route.php定义路由,可以通过直接返回一个数组形式定义路由,也可以通过think的Route类来动态定义路由规则,两者可以混用。一旦定义路由规则,以前的url将会失效。
return [
    // 路由参数name为可选,[]表示参数为可选
    'hello/[:name]' => 'index/hello',
];
  • 3、完美匹配
    上面定义的路由只要是以hello开头的都可以进行匹配,在路由规则后加上$符号,表示完美匹配,只匹配次个hello方法。
return [
    // 路由参数name为可选
    'hello/[:name]$' => 'index/hello',
];
//http://tp5.com/hello // 正确匹配
//http://tp5.com/hello/thinkphp // 正确匹配
//http://tp5.com/hello/thinkphp/val/value // 不会匹配
  • 4、闭包定义
    定义一些特殊需求的路由,不用执行控制器里的方法。
return [
    // 定义闭包
    'hello/[:name]' => function ($name) {
        return 'Hello,' . $name . '!';
    },
];
  • 5、路由参数
return [
    // 定义路由的请求类型和后缀
    'hello/[:name]' => ['index/hello', ['method' => 'get', 'ext' => 'html']],
];
//http://tp5.com/hello // 无效
//http://tp5.com/hello.html // 有效
//http://tp5.com/hello/thinkphp // 无效
//http://tp5.com/hello/thinkphp.html // 有效
  • 6、变量规则
    用正则的方式指定变量规则,弥补了动态变量无法限制具体的类型问题。

路由规则

return [
    'blog/:year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],
    'blog/:id'          => ['blog/get', ['method' => 'get'], ['id' => '\d+']],
    'blog/:name'        => ['blog/read', ['method' => 'get'], ['name' => '\w+']],
];
  • 7、路由分组
    如上路由拥有相同的前缀,可以将其进行分组,路由分组一定程度上可以提高路由检测的效率。
return [
    '[blog]' => [
        ':year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],    
        ':id'          => ['blog/get', ['method' => 'get'], ['id' => '\d+']],
        ':name'        => ['blog/read', ['method' => 'get'], ['name' => '\w+']],
    ],
];

三、请求与相应

  • 1、请求对象
    Request对象的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环境变量。获取url:
    传统方法:
public function hello($name = 'World')
    {
        $request = Request::instance();
        // 获取当前URL地址 不含域名
        echo 'url: ' . $request->url() . '
'; return 'Hello,' . $name . '!'; }

继承think\Controller:

class Index extends Controller
{
 public function hello($name = 'World')
    {
        // 获取当前URL地址 不含域名
        echo 'url: ' . $this->request->url() . '
'; return 'Hello,' . $name . '!'; } }

自动注入请求对象:

public function hello(Request $request, $name = 'World')
    {
        // 获取当前URL地址 不含域名
        echo 'url: ' . $request->url() . '
'; return 'Hello,' . $name . '!'; }
  • 2、动态绑定属性
    通过给Request请求对象绑定属性,方便全局调用,首先定义一个新建一个控制器,给Request请求对象绑定属性,以后的控制器可以通过继承该控制器直接调用其属性。
class Base extends Controller
{
    public function _initialize()
    {
        $user = User::get(Session::get('user_id'));
        Request::instance()->bind('user',$user);
    }
}
class Index extends Base
{
    public function index(Request $request)
    {
        echo $request->user->id;
        echo $request->user->name;
    }
}
  • 3、助手函数
    如果既没有继承think\Controller也不想给操作方法添加额外的Request对象参数,那么也可以使用系统提供的助手
class Index
{
    public function hello($name = 'World')
    {
        // 获取当前URL地址 不含域名
        echo 'url: ' . request()->url() . '
'; return 'Hello,' . $name . '!'; } }
  • 4、获取请求参数
    使用param方法统一获取当前请求变量,该方法最大的优势是让你不需要区分当前请求类型而使用不同的全局变量或者方法,并且可以满足大部分的参数需求。
class Index
{
    public function hello(Request $request)
    {
        echo '请求参数:';
        dump($request->param());
        echo 'name:'.$request->param('name');
    }
}

通过input助手函数简化Request对象的param方法。

class Index
{
    public function hello()
    {
        echo '请求参数:';
        dump(input());
        echo 'name:'.input('name');
    }
}

param方法获取参数会自动判断当前请求,参数优先级为:路由变量 > 当前请求变量(_GET变量。除了param方法外,还可以通过get、post、cookie、file方法获取参数。
获取参数信息:

class Index
{
    public function hello(Request $request)
    {
        echo '请求方法:' . $request->method() . '
'; echo '资源类型:' . $request->type() . '
'; echo '访问IP:' . $request->ip() . '
'; echo '是否AJax请求:' . var_export($request->isAjax(), true) . '
'; echo '请求参数:'; dump($request->param()); echo '请求参数:仅包含name'; dump($request->only(['name'])); echo '请求参数:排除name'; dump($request->except(['name'])); } }

获取URL信息:

class Index
{
    public function hello(Request $request,$name = 'World')
    {
        // 获取当前域名
        echo 'domain: ' . $request->domain() . '
'; // 获取当前入口文件 echo 'file: ' . $request->baseFile() . '
'; // 获取当前URL地址 不含域名 echo 'url: ' . $request->url() . '
'; // 获取包含域名的完整URL地址 echo 'url with domain: ' . $request->url(true) . '
'; // 获取当前URL地址 不含QUERY_STRING echo 'url without query: ' . $request->baseUrl() . '
'; // 获取URL访问的ROOT地址 echo 'root:' . $request->root() . '
'; // 获取URL访问的ROOT地址 echo 'root with domain: ' . $request->root(true) . '
'; // 获取URL地址中的PATH_INFO信息 echo 'pathinfo: ' . $request->pathinfo() . '
'; // 获取URL地址中的PATH_INFO信息 不含后缀 echo 'pathinfo: ' . $request->path() . '
'; // 获取URL地址中的后缀信息 echo 'ext: ' . $request->ext() . '
'; return 'Hello,' . $name . '!'; } }

获取当前模块/控制器/操作信息:

public function hello(Request $request, $name = 'World')
    {
        echo '模块:'.$request->module();
        echo '
控制器:'.$request->controller(); echo '
操作:'.$request->action(); }
  • 5、响应对象——自动输出
    一般情况下,不需要关注Response对象本身,只需要在控制器的操作方法中返回数据即可,系统会自动判断是否为Ajax请求,是的话自动输出default_ajax_return配置的输出类型,否则自动输出default_return_type匹配的输出类型。
 'thinkphp', 'status' => '1'];
        //通过手动添加参数的控制,来输出不同格式的参数,无需更改配置文件
        //return json($data);
        return $data;
    }
}

默认情况下输出是html输出。因此上述代码会报错,只有更改配置文件后,才能正常输出。

// 默认输出类型
'default_return_type'    => 'json',

输出类型 快捷方法
渲染模板输出 view
JSON输出 json
JSONP输出 jsonp
XML输出 xml
页面重定向 redirect

  • 6、页面跳转
namespace app\index\controller;

class Index
{
   use \traits\controller\Jump;
   
   public function index($name='')
   {
       if ('thinkphp' == $name) {
           $this->success('欢迎使用ThinkPHP
       5.0','hello');
       } else {
           $this->error('错误的name','guest');
       }
   }
   
   public function hello()
   {
       return 'Hello,ThinkPHP!';
   }
   
   public function guest()
   {
       return 'Hello,Guest!';
   }
   
}
  • 7、页面重定向
namespace app\index\controller;

class Index
{
    use \traits\controller\Jump;
    
    public function index($name='')
    {
        if ('thinkphp' == $name) {
            $this->redirect('http://thinkphp.cn');
        } else {
            $this->success('欢迎使用ThinkPHP','hello');
        }
    }
    
    public function hello()
    {
        return 'Hello,ThinkPHP!';
    }

}

在没有引入Jump trait的情况下,可以使用助手函数redirect函数进行重定向。

namespace app\index\controller;

class Index
{
    public function index($name='')
    {
        if ('thinkphp' == $name) {
            return redirect('http://thinkphp.cn');
        } else {
            return 'Hello,ThinkPHP!';
        }
    }

}

你可能感兴趣的:(TP5基础)