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

心智極客發表於2020-01-08

原文連結

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

相關文章