route — 名前付きルートからURLを生成するヘルパ

helper
  • カテゴリ: helper
  • 対応バージョン: Laravel 11・12・PHP 8.2(※指定なしのため既定)
  • 名前空間 / FQCN / コマンド: グローバル関数 route()
  • 関連: url / action / to_route / redirect()->route() / URL::signedRoute()
  • 変更履歴: 主要仕様に大きな変更なし(to_route() は Laravel 9 で追加)

要点(TL;DR)

  • 用途: 名前付きルートから安全にURLを生成する
  • 最小: route('posts.show', $post)
  • :
    • ルート名 or 必須パラメータの不足で UrlGenerationException
    • プレースホルダ名と配列キーの不一致
    • HTTP/HTTPS 混在は APP_URLURL::forceScheme('https') で調整

概要

route() は、定義済みの名前付きルートに対して、必要なプレースホルダを埋めて完全なURL(既定は絶対URL)を返します。Eloquentモデル(UrlRoutable)を渡すと、ルートキー(通常はidslug)で自動解決されます。余剰キーはクエリ文字列として付与されます。

構文 / シグネチャ

function route(string $name, array|\Illuminate\Contracts\Routing\UrlRoutable|int|string $parameters = [], bool $absolute = true): string
  • 引数(表)
引数必須既定値説明
$namestringルート名(Route::name() で付与した名前)
$parametersarray | UrlRoutable | int | string[]ルートの {param} に対応する値。配列キーはプレースホルダ名と一致させる。モデル可。余剰キーはクエリに。
$absolutebooltruetrueで絶対URL、falseで相対パス
  • 戻り値string(生成されたURL)
  • 例外/副作用
    • Illuminate\Routing\Exceptions\UrlGenerationException(ルート未定義・必須パラメータ不足・ドメイン不一致 等)
    • スキームやホストは APP_URL / URL::forceRootUrl() / URL::forceScheme() の影響を受ける

使用例

最小例

use Illuminate\Support\Facades\Route;

// ルート定義
Route::get('/posts/{post}', fn ($post) => '...')->name('posts.show');

// URL生成
$url = route('posts.show', ['post' => 10]); 
// 例: https://example.com/posts/10

実務例

use App\Models\Post;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;

// 1) モデルでプレースホルダ解決(Route Model Binding)
Route::get('/posts/{post}', fn (Post $post) => '...')->name('posts.show');

$post = Post::findOrFail(42);
$url  = route('posts.show', $post); // /posts/42

// 2) クエリを付ける(余剰キーはクエリ化)
$list = route('posts.index', ['page' => 2, 'q' => 'laravel']); // /posts?page=2&q=laravel

// 3) 相対URLが欲しい場合
$path = route('posts.show', ['post' => 42], false); // /posts/42

// 4) サブドメイン付きルート
// Route::domain('{account}.example.com')->group(...);
// route('dashboard', ['account' => 'acme']);

// 5) HTTPS を強制(本番ブートストラップ等)
URL::forceScheme('https');

よくある落とし穴・注意

  • プレースホルダ名不一致/users/{user}/posts/{post} なら ['user' => 1, 'post' => 2] のキーが必要。順序で渡すよりキー指定が安全。
  • モデル渡しの要件:モデルは getRouteKey()(既定は主キー)で解決。RouteServiceProvidergetRouteKeyName()を変えている場合は値が変わる。
  • 余剰パラメータはクエリ化:プレースホルダに該当しないキーは ?key=value になる。想定外のクエリ漏れに注意。
  • HTTP/HTTPS/ホスト問題:プロキシ配下や異なるドメインでURLが崩れるときは APP_URLURL::forceRootUrl()URL::forceScheme('https') を調整。
  • 署名付きURLではない:有効期限や改ざん検知が必要なら URL::signedRoute() / URL::temporarySignedRoute() を使う。
  • テストの固定化:テストでホストが環境に依存するなら URL::forceRootUrl('https://example.test') を設定。

代替・関連APIとの比較

  • url():任意パスからURL生成。ルート名は使わない。既存パスに強い。
  • action():コントローラの[Class@method]からURL生成。実装名で紐づけたいとき。
  • redirect()->route() / to_route():リダイレクト用。route()文字列URLto_route()は**RedirectResponse**。
  • URL::signedRoute():署名付きURL。重要リンクやメール認証等に。

テスト例(Pest)

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;

it('generates url from named route', function () {
    URL::forceRootUrl('https://example.test');

    Route::get('/posts/{post}', fn () => 'ok')->name('posts.show');

    expect(route('posts.show', ['post' => 123]))
        ->toBe('https://example.test/posts/123');
});

it('adds extra keys as query string', function () {
    URL::forceRootUrl('https://example.test');

    Route::get('/search', fn () => 'ok')->name('posts.index');

    expect(route('posts.index', ['q' => 'laravel', 'page' => 2]))
        ->toBe('https://example.test/search?q=laravel&page=2');
});

トラブルシュート(エラー別)

症状/エラー原因対処
Route [xxx] not defined.ルート名の綴り違い/未登録ルート定義と名前を確認。php artisan route:listで一覧確認。
UrlGenerationException(必須パラメータ不足){param}に対応するキーが無い配列キーをプレースホルダ名に合わせて渡す。モデル可。
生成URLがHTTPになるスキーム未強制/APP_URLがhttpAPP_URL=https://...、本番で URL::forceScheme('https')
想定外のクエリが付く余剰キーを渡している渡す配列から不要キーを除去。
サブドメインが反映されないドメイン付きルートのプレースホルダ不足['account' => 'acme'] など、ドメイン側のキーも提供する。

参考リンク

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする