[TOC]
RapPhp的的控制器无需继承任何类
### 控制器的位置
* * * * *
#### 1.第一种controller放最前面(优先)
>controller/xxx/xx/AbcController
#### 1.第二种controller目录放后面
> xxx/xxx/xx/controller/AbcController
>[info] 控制器必须以Controller结尾
### 控制器定义
* * * * *
一个比较典型的控制器如下
~~~
namespace app\index\controller;
class IndexController
{
public function index()
{
return ['aa'=>'test'];
}
}
~~~
控制器类文件的实际位置是
~~~
app\index\controller\IndexController.php
~~~
### 自动查找
控制器支持路径自动查找
如
~~~
路径
/a/b/user/save
会自动调用
app\controller\a\b\UserController->save 方法
或者
app\a\b\controller\UserController->save 方法
~~~
### mapping路由
#### 对应命名空间
* * * * *
支持路径和命名空间的对应
~~~
配置项
'mapping'=>[//mvc 的路径配置
"/io"=>"app\a\b",
]
路径
/io/user/save
对应
app\a\b\controller\UserController->save
~~~
#### 对应到控制器
* * * * *
如
~~~
配置
'mapping'=>[//mvc 的路径配置
"/io"=>UserController::class
],
路径
/io/save
对应
UserController->save
~~~
### 输入参数
#### 自动绑定
* * * * *
rapphp 的控制器的方法支持自动参数绑定
~~~
namespace app\index\controller;
class UserController
{
public function save($id,$name,$sex)
{
return ['success'=>true];
}
}
~~~
save方法里的 $id,$name,$sex可以自动由GET 参数获取或POST 参数获取,如果 PUT的是 json 也可以自动获取
#### search 参数
* * * * *
很多人喜欢这样的url `/index/12/3434/test/34`
这里路径上有三个是数字
路径查找等于 去掉数字后的路径 `/index/test`
三个参数可以通过下面方式获取
~~~
public function test(Request $request) {
$search = $request -> search();//获取到search 参数
$cat_id = $search[0];
$test_id = $search[1];
$id = $search[2];
return ['success'=>true];
}
~~~
当然也支持绑定
~~~
//Search的是按出现的顺序取值
public function test(Search $cat_id, Search $test_id, Search $id) {
$cat_id = $cat_id -> value();
$test_id = $test_id -> value();
$id = $id -> value();;
return ['success'=>true];
}
~~~
#### 绑定到模型
自动绑定的参数支持绑定到对象的对应属性上
* * * * *
~~~
namespace app\index\model;
class User extend extends Record
{
public $id;
public $name;
public $sex;
}
* * * * * * * * * * * * * * * * * * * * * * * * *
namespace app\index\controller;
class UserController
{
public function save(User $user)
{
$user->save();
return ['success'=>true];
}
}
~~~
这里绑定到的对象 是Record(模型)的子类;也可以绑定到任意模型上
#### 文件上传
* * * * *
通过File对象可以绑定上传的同名文件
~~~
namespace app\index\controller;
use rap\storage\File;
class FileController
{
public function upload(File $file)
{
return $file;
}
}
~~~
#### 多文件上传
~~~
public function thumbs(Request $request, $base = 'upload') {
$files = $request->files('file');
return ["success"=>true];
}
~~~
更多文件上传的内容需要查看Storage 模块的文档
### 输出结果
#### 输出 json
* * * * *
json 输出是最常见的,控制器默认会将所有非字符串类型的 全部已 json_encode 输出
~~~
class IndexController
{
public function save()
{
return ['success'=>true,msg=>'保存成功'];
}
}
~~~
输出的请求头是application/json
内容是
~~~
{'success':true,'msg':'保存成功'}
~~~
#### 输出纯文本
如果想在结构里输出纯文本 retutn body 方法
~~~
class IndexController
{
public function save()
{
return body('这里是你的文本内容')
}
}
~~~
#### 重定向
默认重定向的 http_response_code为302
~~~
return redirect('a',302); //同路径
return redirect('/a/a',302); //根路径
return redirect("http://baidu.com/other/page",302); //绝对路径
~~~
#### 文件下载
~~~
$file=ROOT_PATH.'test.zip';
retrun download($file,'文件名');
~~~