Laravel资源控制器show()方法中模型实例自动注入的原理问询
Laravel资源控制器show()方法中模型实例自动注入的原理问询
嘿,别担心这个问题一点都不傻!很多刚接触Laravel的开发者都会对这个“自动拿到模型实例”的魔法感到困惑😉
这其实是Laravel的隐式路由模型绑定在起作用,整个链条的逻辑是这样的:
1. 自动生成的路由参数
你使用Route::apiResource('customers', CustomerController::class)时,Laravel会自动为你生成符合RESTful规范的路由,其中show方法对应的路由是:
GET /api/v1/customers/{customer}
这里的{customer}就是路由参数,它的名字和你控制器show方法里的变量名$customer完全一致,这是触发自动绑定的关键前提。
2. 类型提示触发自动绑定
当请求http://mydomain/api/v1/customers/1进来时,Laravel的服务容器会检测到show方法的参数有Customer $customer这个类型提示——它会立刻识别出你需要一个Customer模型的实例。
3. 自动查询并注入实例
接下来Laravel会自动完成你原本要手动写的查询逻辑:
- 提取路由参数的值(也就是
1)作为匹配条件 - 去
customers表(Laravel默认会把模型类名转为复数表名)中查找id等于该值的记录 - 如果找到对应的记录,就把这个
Customer模型实例直接注入到$customer变量里;如果没找到,默认会自动返回404 NotFound响应,完全不用你自己写Customer::find($id)这类代码
额外小技巧:自定义绑定字段
要是你不想用id作为匹配字段(比如想用slug这类业务字段),可以在Customer模型里添加一个方法:
public function getRouteKeyName() { return 'slug'; }
这样Laravel就会用路由参数的值去匹配customers表的slug字段,而不是默认的id了。
备注:内容来源于stack exchange,提问作者Vadim Gerich
相关产品推荐
相关产品推荐

