Laravelのブレードの中で、aタグでリンクを設定したい時に、ルート名を使うと簡単にリンクを設定することができます。
ここでは、ルート名を指定してリンクを作成する方法や、パラメータの渡し方を実例でまとめています。
ルート名を使ったリンクの指定方法
基本的な書き方
ルート名を使ってリンクの飛び先を指定するには、routeヘルパを使って、ルート名と渡すデータを指定します。
<a href="{{ route('ルート名') }}">
パラメータを渡す場合
パラメータを渡す場合は、routeヘルパの第2引数に配列を記載して、'パラメータ名'=>'値'
とします。
<a href="{{ route('ルート名', ['パラメータ名'=>'値']) }}">
パラメータが複数必要なURI(パス)に対しては、配列の中で、「,(カンマ)」を記述し、'パラメータ名'=>'値'
を複数記述します。
<a href="{{ route('ルート名', ['パラメータ名1'=>'値1', ['パラメータ名2'=>'値2'],,,]) }}">
ルート名を使ったリンクの設定手順
ルート名を使ってリンクを設定する手順は以下のようになります。
実例として、/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('ビューファイル名' [, 渡すデータ] )
- ビューファイル名は.blade.phpを省略して記述。
- viewsの中のディレクトリ配下のビューファイルを指定する場合は「ディレクトリ名. 」で繋でいく。
- 第2引数の配列部分(渡すデータ)は省略可能。
- 渡すデータは
[ '渡す変数名'=>値 ]
で指定する。
このため、
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つのビューファイルを作成します。
- index.blade.php
- 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を表示する。
応用編|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
)
応用編|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を渡します。