## 創建core/Controller.php
```
<?php
namespace core;
class Controller
{
protected $middleware = [];
// 獲取中間件
public function getMiddleware()
{
return $this->middleware;
}
// 調用控制器方法 為了不限制參數
// 所以方法設不設置$request 都無所謂
public function callAction($method, $parameters)
{
return call_user_func_array([$this, $method], $parameters);
}
}
```
## 創建app/controller/UserController.php
```
<?php
namespace App\controller;
use App\middleware\ControllerMiddleWare;
use core\Controller;
use core\request\RequestInterface;
// 繼承基礎控制器
class UserController extends Controller
{
protected $middleware = [ // 這個控制器的中間件
ControllerMiddleWare::class
];
public function index(RequestInterface $request)
{
return [
'method' => $request->getMethod(),
'url' => $request->getUri()
];
}
public function index2()
{
}
}
```
## 編輯core/RouteCollection.php的dispatch方法
```
// 根據request執行路由
public function dispatch(RequestInterface $request)
{
$method = $request->getMethod();
$uri = $request->getUri();
$this->route_index = $method . $uri;
$route = $this->getCurrRoute();
if(! $route)
return 404;
$middleware = $route['action']['middleware'] ?? [];
$routerDispatch = $route['action']['uses'];
if(! $route['action']['uses'] instanceof \Closure){ // 不是閉包 就是控制器了
$action = $route['action'];
$uses = explode('@',$action['uses']);
$controller = $action['namespace'].'\\'.$uses[0]; // 控制器
$method = $uses[1]; // 執行的方法
$controllerInstance = new $controller;
$middleware = array_merge($middleware,$controllerInstance->getMiddleware()); // 合并控制器中間件
$routerDispatch = function ($request) use($route, $controllerInstance, $method){
return $controllerInstance->callAction($method,[ $request ]);
};
}
return \App::getContainer()->get('pipeline')->create()->setClass(
$middleware
)->run($routerDispatch)($request);
}
```
## 測試下
### 創建app\middleware\ControllerMiddleWare.php
因為`UserController` 調用 這個中間件,所以要創建。
```
<?php
namespace App\middleware;
use core\request\RequestInterface;
class ControllerMiddleWare
{
public function handle(RequestInterface $request, \Closure $next)
{
echo "<hr/>controller middleware<hr/>";
return $next($request);
}
}
```
### 運行

- 前言
- 基礎篇
- 1. 第一步 創建框架目錄結構
- 2. 引入composer自動加載
- 3. php自動加載 (解釋篇)
- 4. 創建容器 注冊樹模式
- 5. 關于psr規范解釋
- 6. 關于"容器" "契約" "依賴注入" (解釋篇)
- 7. 添加函數文件helpers.php
- 8. 初始化請求(Request)
- 9. 響應 (Response)
- 10. 路由一 (路由組實現)
- 11. 路由二 (加入中間件)
- 12. 配置信息 (類似laravel)
- 13. 數據庫連接 (多例模式)
- 14. 查詢構造器 (query builder)
- MVC實現
- M 模型實現 (數據映射 + 原型 模式)
- C 控制器實現 + 控制器中間件
- V 視圖實現 (Laravel Blade 引擎)
- V 視圖切換成 ThinkPhp 模板 引擎)
- 其他輪子
- 日志
- 自定義異常 (異常托管)
- 單元測試 (phpunit)
- 替換成swoole的http服務器
- 協程上下文解決request問題
- qps測試
- 發布到packagist.org