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 生成应当遵守以下两条规范:
- 尽量使用
route
方法 - 尽量传入 Model 实例作为路由参数
本作品采用《CC 协议》,转载必须注明作者和本文链接