大数跨境

使用路由模型绑定简化您的 Laravel 代码!

使用路由模型绑定简化您的 Laravel 代码! 索引目录
2025-10-16
2
导读:关注「索引目录」公众号,获取更多干货。你正在使用 Laravel 吗?我目前主要使用 TypeScript,但有时也会接触 Laravel。

关注「索引目录」公众号,获取更多干货。

你正在使用 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 还有许多我尚未发现的功能。


关注「索引目录」公众号,获取更多干货。


【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读1.1k
粉丝0
内容444