RapPhp的的控制器无需继承任何类,只要求控制器的类名以Controller结尾,并且要求控制器的命名空间(namespace)以\controller结尾; >[info] 类要求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 方法 ~~~ 这样控制器支持无限极向下分组 >[info]作为默认如果没有配置 都会到/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 >具体原因可以参照 [异常显示](https://www.kancloud.cn/tengzhinei/rapphp/585891) 页面渲染,只需要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); ~~~