如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
// 修改应用类库命名空间
'app_namespace' => 'application',
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
// 获取包含域名的完整URL地址
$this->assign('domain',$this->request->url(true));
return $this->fetch('index');
}
}
渲染模板
return $this->fetch('index');
return view('index');
return json_encode($data);
// 设置默认输出类型
'default_return_type' => 'json',
控制器初始化
public function _initialize()
{
echo 'init<br/>';
}
前置操作 beforeActionList
protected $beforeActionList = [
'first',//全部执行
'second' => ['except'=>'hello'],//except执行此方法时不执行,最后执行
'three' => ['only'=>'hello,data'],//只有指定的执行,,最后在执行相应方法
];
protected function first()
{
echo 'first<br/>';
}
跳转/重定向
success/error
//设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
$this->success('新增成功', 'User/list');
//错误页面的默认跳转页面是返回前一页,通常不需要设置 javascript:history.back(-1);
$this->error('新增失败');
默认时间3s
相应模板 THINK_PATH . 'tpl/dispatch_jump.tpl'
//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => 'public/error',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => 'public/success',
变量 含义
$data 要返回的数据
$msg 页面提示信息
$code 返回的code
$wait 跳转等待时间 单位为秒
$url 跳转页面地址
重定向
//重定向到News模块的Category操作
$this->redirect('News/category', ['cate_id' => 2]);
//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);
通过session闪存数据传值
$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
记住当前的URL后跳转
redirect('News/category')->remember();
需要跳转到上次记住的URL的时候使用:
redirect()->restore();
空操作
找不到方法时执行
public function _empty($name)
{
//把所有城市的操作解析到city方法
return $this->showCity($name);
}
空控制器
<?php
namespace app\index\controller;
use think\Request;
class Error
{
public function index(Request $request)
{
//根据当前控制器名来判断要执行那个城市的操作
$cityName = $request->controller();
return $this->city($cityName);
}
}
// 更改默认的空控制器名
'empty_controller' => 'MyError',
多级控制器
application/index/controller/one/Blog.php
访问地址 http://serverName/index.php/index/one.blog/index
路由中使用 \think\Route::get('blog/add','index/one.Blog/add');
分层控制器
分层控制器是不能够被URL访问直接调用到的,只能在访问控制器、模型类的内部,或者视图模板文件中进行调用。
namespace app\index\event;
class Blog
{
public function insert()
{
return 'insert';
}
public function update($id)
{
return 'update:'.$id;
}
public function delete($id)
{
return 'delete:'.$id;
}
}
$event = \think\Loader::controller('Blog', 'event');
echo $event->update(5); // 输出 update:5
echo $event->delete(5); // 输出 delete:5
为了方便调用,系统提供了controller助手函数直接实例化多层控制器,例如:
$event = controller('Blog', 'event');
echo $event->update(5); // 输出 update:5
echo $event->delete(5); // 输出 delete:5
支持跨模块调用,例如:
$event = controller('Admin/Blog', 'event');
echo $event->update(5); // 输出 update:5
除了实例化分层控制器外,还可以直接调用分层控制器类的某个方法,例如:
echo \think\Loader::action('Blog/update', ['id' => 5], 'event'); // 输出 update:
也可以使用助手函数action实现相同的功能:
echo action('Blog/update', ['id' => 5], 'event'); // 输出 update:5
利用分层控制器的机制,我们可以用来实现Widget(其实就是在模板中调用分层控制器),例如:
定义index\widget\Blog控制器类如下:
namespace app\index\widget;
class Blog {
public function header()
{
return 'header';
}
public function left()
{
return 'left';
}
public function menu($name)
{
return 'menu:'.$name;
}
}
我们在模板文件中就可以直接调用app\index\widget\Blog分层控制器了,
使用助手函数action
{:action('Blog/header', '', 'widget')}
{:action('Blog/menu', ['name' => 'think'], 'widget')}
框架还提供了widget函数用于简化Widget控制器的调用,
可以直接使用助手函数widget
{:widget('Blog/header')}
{:widget('Blog/menu', ['name' => 'think'])}
自动定位控制器
如果你使用了多级控制器的话,可以设置controller_auto_search参数开启自动定位控制器,便于URL访问,例如首先在配置文件中添加:
'controller_auto_search' => true,
namespace app\index\controller\one;
use think\Controller;
class Blog extends Controller
{
public function index()
{
return $this->fetch();
}
public function add()
{
return $this->fetch();
}
public function edit($id)
{
return $this->fetch('edit:'.$id);
}
}
我们就可以直接访问下面的URL地址了:
http://serverName/index.php/index/one/Blog
资源控制器
// 生成index模块的Blog资源控制器
php think make:controller index/Blog
或者使用完整的命名空间生成
php think make:controller app\index\controller\Blog
然后你只需要为资源控制器注册一个资源路由:
Route::resource('blog','index/Blog');
设置后会自动注册7个路由规则,如下:
请求类型 生成路由规则 对应操作方法
GET blog index
GET blog/create create
POST blog save
GET blog/:id read
GET blog/:id/edit edit
PUT blog/:id update
DELETE blog/:id delete
王明昌博客
