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