一 控制器
ThinkPHP V5.0的控制器定义比较灵活,可以无需继承任何的基础类,也可以继承官方封装的\think\Controller
类或者其他的控制器类。
\think\Controller 控制器的5个属性和8个方法
5个属性
1 视图类实例对象protected $view
class Index extends Controller
{
$this->view->assign('user','a');
$this->view->fetch();
}
2 请求类实例对象protected $request
class Index extends Controller
{
$this->request->ip(); //获取请求ip
}
3 验证失败是否抛出异常protected $failException = false
4 是否开启批量验证 protected $batchValidate
5 前置方法列表 protected $beforeActionList
指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法
['except' => '方法名,方法名'] //表示这些方法不使用前置方法,
['only' => '方法名,方法名'] //表示只有这些方法使用前置方法。
class Index extends Controller{
//first是所有方法的前置方法(其它方法在访问时会触发first方法)
//second是所有方法(除了hello方法)的前置方法(其它方法在访问时会触发second方法)
//three是hello,data方法的前置方法(hello,data方法在访问时会触发three方法)
protected $beforeActionList = [
'first',
'second' => ['except'=>'hello'],
'three' => ['only'=>'hello,data'],
];
protected function first(){}
protected function second(){}
protected function three(){}
public function hello(){}
public function data(){}
}
8 个方法:
1 构造方法 __construct()
2 初始化函数 __initialize()
3 加载模板 fetch()
public function index()
{
return this->fetch(); //返回视图模板
}
5 初始化模板引擎 engine()
使用tp5自带的模板引擎,也可以使用Smarty或其它模板引擎
6 模板变量赋值 assign()
5 初始化模板引擎 engine()
使用tp5自带的模板引擎,也可以使用Smarty或其它模板引擎
6 模板变量赋值 assign()
7 验证失败抛出异常 validateFailException
8 验证数据 validate(见 验证)
跳转与重定向
两个跳转方法 success
和 error
,用于页面跳转提示
跳转地址是可选的,success方法的默认跳转地址是$_SERVER["HTTP_REFERER"]
,error方法的默认跳转地址是javascript:history.back(-1)
可以使用项目内部的模板文件
//默认错误跳转对应的模板文件'dispatch_error_tmpl' => 'public/error', //view/public/error
//默认成功跳转对应的模板文件'dispatch_success_tmpl' => 'public/success', //view/public/success
模板文件可以使用模板标签,并且可以使用下面的模板变量:
变量 | 含义 |
---|---|
$data | 要返回的数据 |
$msg | 页面提示信息 |
$code | 返回的code |
$wait | 跳转等待时间 单位为秒 |
$url | 跳转页面地址 |
重定向
\think\Controller
类的redirect
方法可以实现页面的重定向功能
//重定向到News模块的Category操作
$this->redirect('News/category', ['cate_id' => 2]);
空操作
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty
)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化
空控制器
空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化
二 请求
如果要获取当前的请求信息,可以使用\think\Request
类,如果在控制器(继承了think\Controller)里直接调用属性request($this->request)
获取URL信息
$request = Request::instance();
echo 'domain: ' . $request->domain(); // 获取当前域名
echo 'file: ' . $request->baseFile(); // 获取当前入口文件
echo 'url: ' . $request->url(); // 获取当前URL地址 不含域名
echo 'url with domain: ' . $request->url(true); // 获取包含域名的完整URL地址
echo 'url without query: ' . $request->baseUrl(); // 获取当前URL地址 不含QUERY_STRING
echo 'root:' . $request->root(); // 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true); // 获取URL访问的ROOT地址
echo 'pathinfo: ' . $request->pathinfo(); // 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->path(); // 获取URL地址中的PATH_INFO信息 不含后缀
echo 'ext: ' . $request->ext(); // 获取URL地址中的后缀信息
设置/获取 模块/控制器/操作名称
$request = Request::instance();
echo "当前模块名称是" . $request->module();
echo "当前控制器名称是" . $request->controller();
echo "当前操作名称是" . $request->action();
获取请求参数
$request = Request::instance();
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']));
检测变量是否设置
可以使用has
方法来检测一个变量参数是否设置
Request::instance()->has('id','get');
Request::instance()->has('name','post');
//或者使用助手函数
input('?get.id');
input('?post.name');
变量获取
变量类型方法包括
例 获取PARAM
变量
Request::instance()->param('name'); // 获取当前请求的name变量
Request::instance()->param(); // 获取当前请求的所有变量(经过过滤)
Request::instance()->param(false); // 获取当前请求的所有变量(原始数据)
Request::instance()->param(true); // 获取当前请求的所有变量(包含上传文件)
使用助手函数实现
input('param.name');
获取请求类型
if (Request::instance()->isGet()) echo "当前为 GET 请求"; // 是否为 GET 请求
if (Request::instance()->isPost()) echo "当前为 POST 请求"; // 是否为 POST 请求
if (Request::instance()->isPut()) echo "当前为 PUT 请求"; // 是否为 PUT 请求
if (Request::instance()->isDelete()) echo "当前为 DELETE 请求"; // 是否为 DELETE 请求
if (Request::instance()->isAjax()) echo "当前为 Ajax 请求"; // 是否为 Ajax 请求
if (Request::instance()->isPjax()) echo "当前为 Pjax 请求"; // 是否为 Pjax 请求
if (Request::instance()->isMobile()) echo "当前为手机访问"; // 是否为手机访问
if (Request::instance()->isHead()) echo "当前为 HEAD 请求"; // 是否为 HEAD 请求
if (Request::instance()->isPatch()) echo "当前为 PATCH 请求"; // 是否为 Patch 请求
if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求";
if (Request::instance()->isCli()) echo "当前为 cli"; // 是否为 cliif
if (Request::instance()->isCgi()) echo "当前为 cgi"; // 是否为 cgiif
可以使用Request对象的header方法获取当前请求的HTTP 请求头信息
$info = Request::instance()->header();
echo $info['accept'];
echo $info['accept-encoding'];
echo $info['user-agent'];
方法注入 如果需要在Request
请求对象中添加自己的方法,可以使用Request
对象的方法注入功能
// 通过hook方法注入动态方法Request::hook('user','getUserInfo');
getUserInfo函数定义如下
function getUserInfo(Request $request, $userId){
// 根据$userId获取用户信息
return $info;
}
我们可以直接在控制器中使用
public function index(){
$info = Request::instance()->user($userId);
}
可以动态注入当前Request
对象的属性
// 动态绑定属性
Request::instance()->bind('user',new User);
// 或者使用
Request::instance()->user = new User;
获取绑定的属性使用下面的方式
Request::instance()->user;
参数绑定
tp5默认的参数绑定是按名称绑定即url上以名值对方式对应
// URL参数方式改成顺序解析'
url_param_type' => 1,