关注「索引目录」公众号,获取更多干货。
你正在使用 Laravel 吗?
我目前主要使用 TypeScript,但有时也会接触 Laravel。
收到请求后检查数据是否存在是一个很常见的场景。我最近发现了一些新东西(至少对我来说!),所以想和大家分享一下。
传统实施模式
假设您有一个功能,可以使用检索帖子信息post_id并在屏幕上显示详细信息。
class PostController extends Controller
{
public function edit(PostEditRequest $request)
{
$detail = Post::where('id', $request->post_id)->first();
return view('post', ['data' => $detail]);
}
}
在 FormRequest 中:
class PostEditRequest extends FormRequest
{
public function rules()
{
return [
'post_id' => 'required|exists:posts,id'
];
}
}
或者,您可以像这样设置路由:
Route::get('/post/{id}', [PostController::class, 'edit']);
并在控制器中处理它:
class PostController extends Controller
{
public function edit(int $id)
{
$detail = Post::where('id', $id)->first();
if (is_null($detail)) {
// Handle error
}
return view('post', ['data' => $detail]);
}
}
这些都是非常标准的模式,对吗?
什么是路由模型绑定?
我最近学习了“路由模型绑定”——显然它已经存在很久了。(请不要因为我不了解它而评判我!😅)
使用路由模型绑定,您可以执行以下操作:
Route::get('/post/{post}', [PostController::class, 'edit']);
在你的控制器中:
class PostController extends Controller
{
public function edit(Post $post)
{
return view('post', ['data' => $post]);
}
}
当您的代码到达控制器时,您已经有一个 Eloquent 模型实例!
另外,如果 ID 不存在,Laravel 会自动返回 404 错误。多么方便啊!
按非主键列搜索
您还可以执行以下操作:
Route::get('/post/{post:post_uuid}', [PostController::class, 'edit']);
这将按不同的列进行搜索。如果找到,控制器将处理它;如果没有找到,则会返回 404 错误。
如果您需要 ID 验证,但实施 FormRequest 感觉有点过度,那么这种方法可能非常适合您的用例。
绑定相关模型
这里还有一个好处:您还可以将路由模型绑定与相关数据一起使用。
例如,假设您要检索属于特定公司的员工数据:
Route::get('/company/{company}/employee/{employee}', [EmployeeController::class, 'detail'])->scopeBindings();
这可确保当控制器处理请求时,您拥有与公司相关联的员工模型。
在您的控制器中:
class EmployeeController extends Controller
{
public function detail(Company $company, Employee $employee)
{
// Do something
}
}
为了实现这一点,Laravel 的 Eloquent ORM 需要理解父子关系。你需要在 Company 模型中定义这种关系:
class Company extends Model
{
public function employees(): HasMany
{
return $this->hasMany(Employee::class);
}
}
(还有其他方法可以建立这些关系,但我现在先跳过这些。)
概括
-
路由模型绑定会在你到达控制器时为你提供一个模型实例 -
非常适合不需要复杂验证的简单实现 -
自动返回不存在数据的 404 错误
-
您可以通过主键以外的列进行搜索 -
父子关系可以使用 scopeBindings() -
这将自动验证指定的员工是否确实属于该公司
何时使用什么
- 在以下情况下使用 FormRequest
:您有复杂的验证规则或需要自定义错误消息 - 在以下情况下使用路由模型绑定
:简单的存在性检查就足够了,并且您想要更清晰的代码
总结
路由模型绑定非常简单,而且非常方便!Laravel 还有许多我尚未发现的功能。
关注「索引目录」公众号,获取更多干货。

