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 网站上。

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~