控制器
RapPhp的的控制器无需继承任何类,只要求控制器的类名以Controller结尾,并且要求控制器的命名空间(namespace)以\controller结尾;
类要求Controller结尾是为了在 ide 里好区分,防止重名类出现命名空间(namespace)以controller结尾为了安全
``
控制器定义
一个比较典型的控制器如下
namespace app\index\controller;
class IndexController
{
public function index()
{
return 'index';
}
}
控制器类文件的实际位置是
app\index\controller\IndexController.php
路径查找
路径查找是 RapPhp 特色功能,控制器的访问路径可以通过访问的路径自动查找,支持无限级分组
如配置
'mapping'=>[//mvc 的路径配置
"/io"=>"/app/io",
],
这里定义/io 的查找前缀是/app/io
那么路径
/io/user/save
对应的控制器为
app\io\controller\UserController.php
的
save 方法
/io/user/event/save
对应的控制器为
app\io\user\controller\EventController.php
的
save 方法
这样控制器支持无限极向下分组
作为默认如果没有配置 都会到/app下进行查找 ,上面配置其实不配置也能访问到
前缀到类
如配置
'mapping'=>[//mvc 的路径配置
"/io"=>UserController::class
],
那么路径
/io/save
对应的控制器为
app\io\controller\UserController.php
的
save 方法
这样路径可以少到两级结构
特别说明默认当路径只有两级时如 /book/test 找的控制器为 app/controller/BookController 的 test 方法
输出JSON
控制器输出 JSON ,只需要控制器return对象或数组就行输出内容会自动转换为数组
class IndexController
{
public function save()
{
return ['success'=>true,msg=>'保存成功'];
}
}
输出的请求头是application/json内容是
{'success':true,'msg':'保存成功'}
两个默认的返回
public function save()
{
return success('保存成功');
}
public function save()
{
return fail('保存失败');
}
页面渲染输出
建议大家在返回的是页面的情况下路径后面添加上后缀 如/test/list.html或/test/list.do具体原因可以参照 异常显示
页面渲染,只需要return模板页面的路径,查找的模板地址默认为上一级 下view目录的同名的. html 文件
namespace app\index\controller;
class IndexController
{
public function index()
{
return 'index';
}
}
这里查找的模板地址为
app/index/view/index.html
如果 以/开头的话
配置项为
'view'=>[
'type'=>'twig',
'template_base'=>'template' //默认模板位置
]
返回结果是
retrun '/index';
那查找的模板地址为
template/index.html
模板引擎
RapPhp 可以和任意模板引擎搭配使用框架提供了 twig smarty 和 php三种默认实现 , 默认实现都只是展示,正式项目中需要自己写实现类配置模板的配置如下
'view'=>[
'type'=>'twig', //smarty或 php
'template_base'=>'template'
],
如果你喜欢其他模板引擎,只需要自己写个类集成自rap\web\mvc\view\View 就可以了
模板传递数据
可以通过 $response->assign方法进行传递
namespace app\index\controller;
class IndexController
{
public function index(Request $request,Response $response)
{
$response->assign("a","a");
return 'index';
}
}
重定向
默认重定向的 http_response_code为200
return redirect('a'); //同路径
return redirect('/a/a'); //根路径
return redirect("http://baidu.com/other/page"); //绝对路径
输出内容到 body
retrun body('内容')';
文件下载
$file=ROOT_PATH.'test.zip';
retrun downloadFile($file);