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 協議》,轉載必須註明作者和本文連結