Laravel Url 使用指南 4-1 基础篇

原文链接

Laravel 提供了三种方法来生成 Url

  • Action 辅助方法
  • Url 辅助方法
  • Route 辅助方法

参数

每种方法都可以传递两种类型的路由参数,数值或者 Model 实例

$post = Post::first();
// 传入数值
$show = route('posts.show', $post->id);
// 传入 Model 实例
$show = route('posts.show', $post);

使用 Model 实例的话 Laravel 将自动获取模型的路由主键,相当于

route('posts.show', $this->getRouteKey()); 

或者

route('posts.show', $this->getAttribute($this->getRouteKeyName());

例如,文章一开始是使用 id 来作为路由主键,现在,我们想使用 slug 来作为路由主键。

首先,将路由主键定义成 slug

// Post.php
public function getRouteKeyName()
{
    return 'slug'
}

在这种情况下,如果使用数值作为路由参数,就需要进行手动调整

$post = Post::first();
$show = route('posts.show', $post->slug);

如果是传入 Model 实例则不需要作任何变更。

$post = Post::first();
$show = route('posts.show', $post);

因此,强烈推荐使用 Model 示例作为路由参数。

如果不存在路由参数,那么传入的参数将作为 query 参数

action('PostController@index', 'category=php');
// http://site.dev/posts?category=php
action('PostController@index', ['category=php', 'sort=read']);
// http://site.dev/posts?category=php&sort=read

方法

action

action 根据控制器的方法来获取 url。默认使用的是根命名空间

// /app/Providers/RouteServiceProvider.php
protected $namespace = 'App\Http\Controllers';

如果按照默认约定,则不需要完整的命名空间

action('PostController@show', $post);
// 解析成 App\Http\Controllers\PostController

否则需要传入完整的命名空间

action('App\Admin\Controller\PostController@show', $post);

除了用字符串形式来表示控制器的方法外,也支持数组的表示形式

use App\Http\Controllers\PostController;
$url = action([PostController::class, 'show'], $post);

route

route 方法则是根据命名路由来获取 url 。

定义路由并命名

Route::get('/posts/{post}', 'PostController@show')->name('posts.show');

根据命名路由来获取 url

route('posts.show', $post);

url

url 方法用于生成最基础的 url

url("/posts/{$post->id}")

其他用法

// 获取当前路由,不带查询参数
url()->current();

// 获取当前路由,带查询参数
url()->full();

// 获取上一条请求的 url
url()->previous();

三种方法的比较

无论是使用 url 还是 action 方法,只要 url 或者控制器命名发生了变化,那么就要去调整对应的路由,因此不推荐使用。大多数情况下,应当使用 route 命名路由,一是可读性高,二是不用担心受到 url 或者控制器更改的影响。

总结起来,Laravel 的 Url 生成应当遵守以下两条规范:

  1. 尽量使用 route 方法
  2. 尽量传入 Model 实例作为路由参数
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!