路由
定义位置:app/Routes/routes.php,由 App 引导时加载。
use Mtphp\Route;
// 基础
Route::get('/', [HomeController::class, 'index']);
Route::post('/login', [HomeController::class, 'login']);
Route::put('/user/{id}', [UserController::class, 'update']);
Route::delete('/user/{id}',[UserController::class, 'destroy']);
Route::any('/ping', [HomeController::class, 'ping']);
// 参数 + 正则约束:id 必须是数字,name 任意非斜杠字符
Route::get('/user/{id:\d+}', [UserController::class, 'show']);
// 分组:前缀 / 中间件 / 命名空间
Route::group(['prefix' => '/api', 'middleware' => [App\Middleware\Auth::class]], function () {
Route::get('/profile', [UserController::class, 'profile']);
});
// 闭包路由(不会被写入路由缓存)
Route::get('/time', fn () => response()->json(['t' => date('c')]));
- 匹配:先按 HTTP 方法,再按编译后的正则匹配路径。
- 参数注入:路由参数会按名注入控制器方法(见第 7 节)。
- HEAD 自动回退到 GET。
- 编译缓存:
config/route.php的cache=true时,正则表落地runtime/cache/routes.php,后续请求直接查表(闭包动作不缓存);开发期可设false实时生效。
6.1 路由模型绑定(Route Model Binding)
把路径参数自动解析为模型实例,避免控制器里手动 find()。在定义路由之前用 Route::bind($key, $modelClass) 注册:参数名 {user} 与 $key 一致时,框架按主键 findOrFail,找不到直接返回 404。
use Mtphp\Route;
use App\Models\User;
// 方式一:直接绑定模型类(自动按主键查,找不到 → 404)
Route::bind('user', User::class);
Route::get('/users/{user}', [UserController::class, 'show']);
// 方式二:自定义解析闭包(返回 null 同样触发 404)
Route::bind('post', fn ($id) => Post::findOrFail($id));
控制器按参数名收到模型行数组(框架 ORM 返回数组而非对象):
namespace App\Controllers;
use Mtphp\Http\Request;
class UserController
{
// $user 已是查出的模型行(如 ['id'=>1,'name'=>'alice']),无需再 find
public function show(Request $request, $user)
{
return response()->json($user);
}
}
- 绑定信息随路由一起写入编译缓存,开启缓存时同样生效。
- 解析失败时抛出
Mtphp\Exception\ModelNotFoundException(HTTP 404),由App统一转换为 404 响应。