目录
[TOC]
## 新建控制器
你可以在 app/Controller 目录或其子目录中新建控制器,一个控制器的代码实例如下所示:
```php
namespace App\Controller; // 声明控制器的命名空间 (遵循 PSR-4 规范)
use App\Controller\Controller; // 引入 base Controller,所有控制器应继承 base Controller
// 引入所需类
use WorkerF\Http\Requests;
use App\Models\Test;
class TestController extends Controller
{
// 进行依赖注入,控制器执行时会自动注入这些类到方法中
public function test(Test $test, Requests $request)
{
$rst = $test->getData();
return $rst;
}
}
```
## 依赖注入
WorkerA 使用了 IOC 容器进行控制器类实例的获取和控制器实例方法的执行,所以控制器中所有的方法都支持依赖注入,大大提高了框架的可扩展性和灵活性:
```php
// 自动注入 Requests 实例
public function test(Requests $request)
{
return $request->post();
}
```
### 需要注意的一点:
当该方法被配置到动态路由时,依赖注入的参数总是在动态路由传来的参数前面。
例如:
```php
// 正确
public function test(Requests $request, $id)
{
return $id;
}
// 错误
public function test($id, Requests $request)
{
return $id;
}
```
同样,控制器的构造方法也是支持依赖注入的:
```php
namespace App\Controller;
use App\Controller\Controller;
use App\Service\TestService;
class TestController extends Controller
{
protected $service;
// 控制器实例创建时会自动注入 TestService 实例
public function __construct(TestService $testService)
{
$this->service = $testService;
}
}
```
如果注入的实例也有依赖的话,IOC 容器会继续向下查找依赖进行依赖注入,直到所有的依赖注入完成。
如:
```php
namespace App\Service;
use App\Models\Test;
class TestService
{
protected $model;
// IOC 容器在 Controller 中注入 TestService 实例时会先将 Test 实例注入 TestService 实例中,以此类推
public function __construct(Test $test)
{
$this->model = $test;
}
}
```
## 方法的返回值
### 数组、对象
当方法返回数组、对象时,框架会将返回值编码为 json 数据作为 HTTP 响应主体返回给用户。
### 字符串
当方法返回字符串时,框架会原封不动的将字符串作为 HTTP 响应主体返回给用户。
### 闭包
返回闭包时框架会在构建 HTTP Response 时执行闭包。默认以空字符串作为 HTTP 响应主体返回给用户。
重定向方法 Route::redirect() 和 Response::redirect() 的返回值就是闭包,详情请阅读 [WorkerF](https://github.com/wazsmwazsm/WorkerF) 的源码。