TP5基础

2019-04-19  本文已影响0人  yzw12138

一、基础

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 命令行入口文件

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

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

<?php
namespace app\index\controller;
class HelloWorld
{
    public function index($name = 'World')
    {
        return 'Hello,' . $name . '!';
    }
}
//直接用http://http://localhost/public/index/HelloWorld访问会报错,控制器不存在
//应该用http://http://localhost/public/index/hello_world访问
//除非在配置文件中设置了关闭url自动转换'url_convert' => false
//通过在url中添加参数来为控制器中的操作方法传递参数http://http://localhost/public/?name=php

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

<html>
<head>
<title>hello {$name}</title>
</head>
<body>
    hello, {$name}!
</body>
</html>

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

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function hello($name = 'thinkphp')
    {
        $this->assign('name', $name);
        return $this->fetch();
    }
}

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

二、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”,此时必须严格按照参数的顺序进行添加。

return [
    // 路由参数name为可选,[]表示参数为可选
    'hello/[:name]' => 'index/hello',
];
return [
    // 路由参数name为可选
    'hello/[:name]$' => 'index/hello',
];
//http://tp5.com/hello // 正确匹配
//http://tp5.com/hello/thinkphp // 正确匹配
//http://tp5.com/hello/thinkphp/val/value // 不会匹配
return [
    // 定义闭包
    'hello/[:name]' => function ($name) {
        return 'Hello,' . $name . '!';
    },
];
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 // 有效
<?php

namespace app\index\controller;

class Blog
{

    public function get($id)
    {
        return '查看id=' . $id . '的内容';
    }

    public function read($name)
    {
        return '查看name=' . $name . '的内容';
    }

    public function archive($year, $month)
    {
        return '查看' . $year . '/' . $month . '的归档内容';
    }
}

路由规则

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+']],
];
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+']],
    ],
];

三、请求与相应

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

继承think\Controller:

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

自动注入请求对象:

public function hello(Request $request, $name = 'World')
    {
        // 获取当前URL地址 不含域名
        echo 'url: ' . $request->url() . '<br/>';
        return 'Hello,' . $name . '!';
    }
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;
    }
}
class Index
{
    public function hello($name = 'World')
    {
        // 获取当前URL地址 不含域名
        echo 'url: ' . request()->url() . '<br/>';
        return 'Hello,' . $name . '!';
    }
}
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方法获取参数会自动判断当前请求,参数优先级为:路由变量 > 当前请求变量(_POST变量) >_GET变量。除了param方法外,还可以通过get、post、cookie、file方法获取参数。
获取参数信息:

class Index
{
    public function hello(Request $request)
    {
        echo '请求方法:' . $request->method() . '<br/>';
        echo '资源类型:' . $request->type() . '<br/>';
        echo '访问IP:' . $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']));
    }
}

获取URL信息:

class Index
{
    public function hello(Request $request,$name = 'World')
    {
        // 获取当前域名
        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/>';

        return 'Hello,' . $name . '!';
    }
}

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

public function hello(Request $request, $name = 'World')
    {
        echo '模块:'.$request->module();
        echo '<br/>控制器:'.$request->controller();
        echo '<br/>操作:'.$request->action();
    }
<?php
namespace app\index\controller;
class Index
{
    public function hello()
    {
        $data = ['name' => 'thinkphp', 'status' => '1'];
        //通过手动添加参数的控制,来输出不同格式的参数,无需更改配置文件
        //return json($data);
        return $data;
    }
}

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

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

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

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

}
上一篇 下一篇

猜你喜欢

热点阅读