ThinkPHP5 0921 总结
路由 控制器 请求
文章目录
一、路由
路由模式
普通模式(important)
关闭路由,完全使用默认的PATH_INFO方式URL:
‘url_route_on’ => false
http://serverName/index.php/module/controller/action/param/value/...
URL 生成
URL生成使用 \think\Url::build() 方法或者使用系统提供的助手函数url(),参数一致
Url::build('地址表达式',['参数'],['URL后缀'],['域名'])
url('地址表达式',['参数'],['URL后缀'],['域名']) -- 助手函数
路由方式是路由到模块/控制器/操作
地址表达式和参数
// 生成index模块 blog控制器的read操作 URL访问地址
Url::build('index/index/test','id=5&name=thinkphp');
// 使用助手函数
url('index/index/test','id=5&name=thinkphp');
效果图:
URL后缀
默认情况下,系统会自动读取url_html_suffix配置参数作为URL后缀(默认为html),如果我们设置了
'url_html_suffix' => 'shtml'
那么自动生成的URL地址变为:
/index.php/blog/5.shtml
如果你希望指定URL后缀生成,则可以使用:
源码:
/**
* Url生成
* @param string $url 路由地址
* @param string|array $vars 变量
* @param bool|string $suffix 生成的URL后缀
* @param bool|string $domain 域名
* @return string
*/
function url($url = '', $vars = '', $suffix = true, $domain = false)
{
return Url::build($url, $vars, $suffix, $domain);
}
Url::build('index/blog/read','id=5','shtml');
url('index/blog/read','id=5','shtml');
二、控制器
ThinkPHP V5.0的控制器定义比较灵活,可以无需继承任何的基础类,也可以继承官方封装的\think\Controller类或者其他的控制器类。
namespace app\index\controller;
class Index
{
public function index()
{
return 'index';
}
}
控制器类文件的实际位置是
application\index\controller\Index.php
控制器初始化
如果你的控制器类继承了\think\Controller类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function _initialize()
{
echo 'init' . '<br />';
}
public function show() {
return 'show';
}
}
访问网站目录
效果图:
前置操作
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
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';
}
}
访问页面 hello 方法
效果图:
跳转和重定向
跳转
public function index()
{
$this->success('操作成功', 'User/list');
// $this->error('操作失败'); 同理
}
运行方法
重定向
\think\Controller类的redirect方法可以实现页面的重定向功能。
//重定向到News模块的Category操作
$this->redirect('News/category', ['cate_id' => 2]);
访问:
跳转和重定向的URL地址不需要再使用url方法进行生成,会自动调用,请注意避免,否则会导致多次生成而出现两个重复的URL后缀
空操作
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
public function _empty($name)
{
//把所有城市的操作解析到city方法
return $name;
}
效果图:
空控制器
空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化。
<?php
namespace app\index\controller;
use think\Request;
class Error
{
public function index(Request $request)
{
//根据当前控制器名来判断要执行那个城市的操作
$cityName = $request->controller();
return $this->city($cityName);
}
//注意 city方法 本身是 protected 方法
protected function city($name)
{
//和$name这个城市相关的处理
return '当前城市' . $name;
}
}
效果图:
空控制器和空操作还可以同时使用,用以完成更加复杂的操作。
空控制器Error是可以定义的
// 更改默认的空控制器名
'empty_controller' => 'MyError',
当找不到控制器的时候,就会定位到MyError控制器类进行操作。
多级控制器
controller 里面可以存放目录可以访问
资源控制器
资源控制器可以让你轻松的创建RESTFul资源控制器,可以通过命令行生成需要的资源控制器
域名是没有改变,是通过请求的类型不同完成不同的逻辑处理
三、请求
请求信息
要获取当前的请求信息,可以使用\think\Request类
$request = Request::instance();
也可以使用助手函数
$request = request();
输入变量
可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括 $ _GET、$ _POST、$ _REQUEST、$ _SERVER、$ _SESSION、 $ _COOKIE、$ _ENV等系统变量,以及文件上传信息。
使用 input 方法
变量过滤
框架默认没有设置任何过滤规则,你可以是配置文件中设置全局的过滤规则:
// 默认全局过滤方法 用逗号分隔多个
'default_filter' => 'htmlspecialchars',
变量修饰符
用法:
input('变量类型.变量名/修饰符');
或
Request::instance()->变量类型('变量名/修饰符');
ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括:
如果你要获取的数据为数组,请一定注意要加上 /a 修饰符才能正确获取到。
请求类型
在很多情况下面,我们需要判断当前操作的请求类型是GET、POST、PUT、DELETE或者HEAD,一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求。
ThinkPHP5.0 取消了用于判断请求类型的系统常量(如IS_GET,IS_POST等),统一采用 think\Request类 处理请求类型。
用法如下:
// 是否为 GET 请求
if (Request::instance()->isGet()) echo "当前为 GET 请求";
// 是否为 POST 请求
if (Request::instance()->isPost()) echo "当前为 POST 请求";
// 是否为 PUT 请求
if (Request::instance()->isPut()) echo "当前为 PUT 请求";
// 是否为 DELETE 请求
if (Request::instance()->isDelete()) echo "当前为 DELETE 请求";
// 是否为 Ajax 请求
if (Request::instance()->isAjax()) echo "当前为 Ajax 请求";
// 是否为 Pjax 请求
if (Request::instance()->isPjax()) echo "当前为 Pjax 请求";
// 是否为手机访问
if (Request::instance()->isMobile()) echo "当前为手机访问";
// 是否为 HEAD 请求
if (Request::instance()->isHead()) echo "当前为 HEAD 请求";
// 是否为 Patch 请求
if (Request::instance()->isPatch()) echo "当前为 PATCH 请求";
// 是否为 OPTIONS 请求
if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求";
// 是否为 cli
if (Request::instance()->isCli()) echo "当前为 cli";
// 是否为 cgi
if (Request::instance()->isCgi()) echo "当前为 cgi";
助手函数:
// 是否为 GET 请求
if (request()->isGet()) echo "当前为 GET 请求";
....
依赖注入
ThinkPHP的依赖注入(也称之为控制反转)是一种较为轻量的实现,无需任何的配置,并且主要针对访问控制器进行依赖注入。可以在控制器的构造函数或者操作方法(指访问请求的方法)中类型声明任何(对象类型)依赖,这些依赖会被自动解析并注入到控制器实例或方法中。
namespace app\index\controller;
use think\Request;
class Index
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function hello()
{
return 'Hello,' . $this->request->param('name') . '!';
}
}