mtphp 文档

路由

定义位置: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')]));

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);
    }
}