Laravel 7.x 新特性之路由自定义键和作用域

未匹配的标注

Laravel 7.x 的路由绑定增加了两个特性:

  • 自定义键
  • 自定义作用域

感兴趣的可以在 src/Illuminate/Routing/ImplicitRouteBinding.php 中查看具体的实现。

自定义键

首先来看看自定义键,在先前版本,自定义键可以通过重写模型的 getRouteKeyName 方法来实现

<?php

Route::get('posts/{post}', function (App\Post $post) {
    return $post;
});


class Post
{
  public function getRouteKeyName()
  {
    return 'slug';
  }
}

7.x 新增了在路由参数中直接指定键的方法

<?php

Route::get('posts/{post:slug}', function (App\Post $post) {
    return $post;
});

自定义作用域

自定义作用域的意思是限定第二个模型的作用域,例如我们希望以下路由只获取目标用户的文章,而不是所有文章。按照下面这种方式的话将不会对 $post 实例进行限制

<?php

Route::get('users/{user}/posts/{post}', function(User $user, Post $post){
    dd($user, $post);
});

7.x 对应解决方式

<?php

Route::get('users/{user}/posts/{post:id}', function(User $user, Post $post){
    dd($user, $post);
});

一旦你定义了作用域,路由解析时会调用模型的 resolveChildRouteBinding 方法,来对第二个模型实例进行限定。

src/Illuminate/Database/Eloquent/Model.php - 1521

<?php

public function resolveChildRouteBinding($childType, $value, $field)
{
  return $this->{Str::plural($childType)}()->where($field, $value)->first();
}

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~