【Laravel】ビューファイル(blade)内でルート名(route名)を使ってリンク先を指定する方法を実例で解説|パラメータの渡し方

laravel-prograshi(プロぐらし) Laravel
記事内に広告が含まれていることがあります。
[PR]

Laravelのブレードの中で、aタグでリンクを設定したい時に、ルート名を使うと簡単にリンクを設定することができます。

ここでは、ルート名を指定してリンクを作成する方法や、パラメータの渡し方を実例でまとめています。


ルート名を使ったリンクの指定方法

基本的な書き方

ルート名を使ってリンクの飛び先を指定するには、routeヘルパを使って、ルート名と渡すデータを指定します。

<a href="{{ route('ルート名') }}">


パラメータを渡す場合

パラメータを渡す場合は、routeヘルパの第2引数に配列を記載して、'パラメータ名'=>'値'とします。

<a href="{{ route('ルート名', ['パラメータ名'=>'値']) }}">

パラメータが複数必要なURI(パス)に対しては、配列の中で、「,(カンマ)」を記述し、'パラメータ名'=>'値'を複数記述します。

<a href="{{ route('ルート名', ['パラメータ名1'=>'値1', ['パラメータ名2'=>'値2'],,,]) }}">


ルート名を使ったリンクの設定手順

ルート名を使ってリンクを設定する手順は以下のようになります。

ルート名を使ったリンクの設定手順
  1. ルーティングとルート名の設定。
  2. コントローラの設定。
  3. ビューファイルの設定。

実例として、/user/{user_id}というURI(ページ)へのリンクをルート名で作成する方法を解説します。


ルーティングとルート名の設定

まずは、web.phpにルーティングとルート名を設定します。

ルーティングの設定方法

ルーティングの設定は以下の記述で行います。

Route::get('URI', コントローラ名@アクション名)


ルート名の設定

ルート名の設定は、作成したルーティングの末尾に以下を書き加えます。

->name('ルート名')

なお、矢印の前で改行したり、前後にスペースがあっても問題なく機能します。



実例

パス「/user」、ルート名「name」というページと、「user_id」という名前のパラメータを必要とする、パス「user/{user_id}」、ルート名「user.show」を作成する場合は以下のようになります。

Route::get('uesr', 'UserController@index')->('name')

Route::get('user/{user_id}', 'UserController@show')
   -> name('user.show');

「user/{user_id}」を設定したため、URLに入力された、「user/」の後ろに入力した値が、$user_idとなります。

なお、user/{user_id}にアクセスしたらUserControllerのshowアクションを実行します。


コントローラの設定

続いて、対応するコントローラを作成します。

UserControllerのindexアクションとshowアクションを作成する場合は以下のコマンドを実行します。

$ php artisan make:controller UserController

すると、Http > Controllersディレクトリの中にUserController.phpが作成されます。

UserController.phpの中は以下のように記述します。

class UserController extends Controller
{
    public function index() {
        return view('user.index');
    }

    public function show(Request $request, int $user_iid){
        return view('user.show', ['id'=>$user_iid]);
    }
}

indexアクションと、showアクションの2つを作成しています。

indexアクションは「/user」にアクセスがあったときに実行されます。

showアクションは「/user/{user_id}」にアクセスがあったときに実行されます。


開くビューファイルの指定

コントローラの中のreturn viewは開くビューファイルの指定です。以下のように記述します。

return view('ビューファイル名' [, 渡すデータ] )
  1. ビューファイル名は.blade.phpを省略して記述。
  2. viewsの中のディレクトリ配下のビューファイルを指定する場合は「ディレクトリ名. 」で繋でいく。
  3. 第2引数の配列部分(渡すデータ)は省略可能。
  4. 渡すデータは[ '渡す変数名'=>値 ]で指定する。

このため、

    public function index() {
        return view('user.index');
    }

は、indexアクションが実行されたら、views/user/index.blade.phpを開く指示となります。

    public function show(Request $request, int $user_iid){
        return view('user.show', ['id'=>$user_iid]);
    }

は、showアクションが実行されたら、views/user/show.blade.phpを開く指示となります。

パラメータの値が入った変数「$user_id」を「id」変数名でビューファイルに渡します。(変数名「id」は任意です)。

なお、Request $requestはリクエスト時に渡されたデータがある場合に、$requestという変数に格納しています(インジェクションと呼ぶ)。今回は使っていないので、記述していなくても問題ありません。


ビューファイルの設定

コントローラーのindexアクションとshowアクションが実行されたときに開く2つのビューファイルを作成します。

  1. index.blade.php
  2. show.blade.php


index.blade.php

views/user/index.blade.phpを作成します。

routeヘルパを使って、ルート名「user.show」というルーティングへのリンクを設置します。

パラメータ「user_id」には「5」という数値を渡す場合は以下のようになります。

<p>user.index.view</p>
<a href="{{ route('user.show', ['user_id'=>'5']) }}">ユーザー個別ページへのリンク(user-id:5)</a>

画面の表示は以下のようになります。

リンクをクリックすると、ルート名「user.show」に「$user_id=5」が渡されます。


show.blade.php

views/user/show.blade.phpを作成します。

パラメータとして渡された値を表示する場合は以下のようになります。

user id: {{ $id }}

「$id」の部分には、コントローラのshowアクションで指定した変数名「id」のデータが入ります。

UserController.phpは以下のように記述しているため、変数「id」には「$user_id」のデータが入ります。

return view('user.show', ['id'=>$user_iid]);

データ受け渡しの流れ

データ受け渡しの流れをまとめると以下のようになります。

index.blade.php: ['user_id'=>'5']
┗ $user_idに値5を格納して渡す。
      ↓
ルーティング: Route::get('user/{user_id}', 'UserController@show')
┗ パラメータのuser_idに5が渡される。
      ↓
UserControllerのshowアクション: return view('user.show', ['id'=>$user_id]);
┗ $idに5を格納して渡す
      ↓
show.blade.php: user id: {{ $id }}
┗ 5を表示する。

route.gif


応用編|compactメソッドでデータを渡す

compactによるrouteヘルパのリファクタリング

route名を指定してデータを渡す際に、['渡す変数名'=>'値']を使いましたが、comapct('変数名')というメソッドを使うこともできます。

public function show(Request &request, int $user_id){
        return view('user.show', compact('user_id'));
    }

compactは['変数'=>'値']を渡すときに、値となる変数の名前を、渡すデータの変数名としてそのまま使うものです。

変数名を記述するときに「$」は不要です。


compactの実例

参考にcompactの実例を記載しておきます。

//オブジェクトを格納
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

//配列でオブジェクトを格納
$location_vars = array("city", "state");

//compact
print_r( compact("event", $location_vars) );

出力結果は以下のようになります。

変数名がそのままプロパティ名になっていることがポイントです。

Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

参考:PHP公式 compact


応用編|groupヘルパーを使ったルーティングのグループ化

groupヘルパーを使うとURIやルート名を階層構造で作成することができます。

あるディレクトリ配下に複数ページがある場合に便利です。

実例

recruit/配下にページがある場合以下のように記述することができます。

ルーティングの例

Route::group(['prefix' => 'recruit', 'as' => 'recruit.'], function() {
        Route::get('/', 'RecruitController@index')->name('index');
        Route::group(['prefix' => 'member', 'as' => 'member.'], function() {
            Route::get('{member_id}', 'RecruitController@showMember')->name('show');
        });

prefix: URI
as: ルート名

階層構造のルート名はドットで繋ぎます。



ビューの例

<a href="{{route('recruit.member.show', ['member_id' => '0001'])}}">

ルート名recruit.member.showにmember_idという名前の変数でデータを0001を渡します。

タイトルとURLをコピーしました