8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】ControllerからViewへの変数渡し方法と表示まで

Last updated at Posted at 2022-03-21

こんにちは、最近Laravel楽しいなと思っているLaravel初心者エンジニアです。

今回はControllerからViewへ変数渡す方法とView上で、その変数を展開するところまでまとめてきたいと思います。

Viewであるbladeファイルに変数を渡す方法

方法としては以下の3つがあります。

①配列を使って渡す
②withメソッドを使う
③compact関数を使う

どれを使っても変数を送信することができますが、
可読性の点からcompact関数が良いとのこと。

前提の準備

まずは事前準備ということで、以下を用意します。

1.ルーティングの記述
2.viewを返すControllerファイル
3.bladeファイル

1.ルーティング

web.php
// localhost:8000/view にアクセスしたらVariableControllerのtest関数を呼び出す
Route::get('/view', 'VariableController@test');

2.Controllerファイル

VariableController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class VariableController extends Controller
{
    public function test(){
        // 連想変数を用意
        $users = array(
            'id' => 0,
            'name' => 'テストさん',
            'gender' => '男性', 
        );        
    }
}

3.bladeファイル(一旦中身は空)
以下のディレクトリに追加します。

resources/views/test/test.blade.php

準備ができたところで、Viewに変数を渡すコードを見ていきましょう!

①配列で渡す

VariableController.php
// class名など省略
public function test(){
    // 連想配列を用意
    $test = array(
        'id' => 0,
        'name' => 'テストさん',
        'gender' => '男性', 
    );
    return view('test/test',  ['user' => $test]); // user変数として渡す
}

②withメソッドを使って渡す。

VariableController.php
public function test(){
    // 連想配列を用意
    $test = array(
        'id' => 0,
        'name' => 'テストさん',
        'gender' => '男性', 
    );
    return view('test/test')->with('user', $test); // user変数としてbladeに送る
}

③compact関数

この後のblade出力の都合上、連想配列を$userに変更してます。

VariableController.php
public function test(){
    // 連想配列を用意 $userに変更
    $user = array(
        'id' => 0,
        'name' => 'テストさん',
        'gender' => '男性', 
    );
    return view('test/test', compact('user')); // user変数をbladeに送る、$マークがいらない。
}

bladeに表示してみる

配列の中身を表示

最初に空で作成したtest.blade.phpに以下の記述を行います。

@foeachで渡ってきた$userをループさせています。
配列の値は$dataに格納して、pタグの中に表示させます。

また、表示させる際は{{ }}(マスタッシュ構文)を使います。
その時、Laravelではエスケープ処理も行ってくれています。

test/test.blade.php
  @foreach($user as $data)
    <p>{{ $data }}</p>
  @endforeach

localhost:8000/view にアクセスして画面を確認してみましょう!
どのパターンでも以下のスクショのように表示できたかと思います!

スクリーンショット 2022-03-20 18.46.18.png

連想配列の個別に表示

[ ]で配列のプロパティを指定すれば、配列の中身を個別に出力することも可能です。

test/test.blade.php
<p>IDは: {{ $user['id'] }}</p>
<p>名前は: {{ $user['name'] }}</p>
<p>性別は: {{ $user['gender'] }}</p>

表示は以下の様になります。

スクリーンショット 2022-03-21 1.47.32.png

中身を一覧表示したい際に躓いたエラー

bladeに表示を行う際に、foreachを使わず以下のように書いてみました。

test/test.blade.php
<p>{{ $user }}</p> // 以下のエラーになる。
htmlspecialchars() expects parameter 1 to be string, array given 

簡単に説明すると、{{}}(マスタッシュ構文)を使うとLaravelではエスケープ処理が行われますが、
その際の渡す値は文字列でなければなりません
と怒られています。

連想配列をそのまま表示させることはできないとのことですね。
普段のVue感覚でいけると思ってしまった。。(笑)

配列の中身をbladeで確認したい場合

では配列を一覧で確認したい場合はどうするかと言うと、phpのver_dump関数を使います。

blade内でphp関数を使う場合、@phpディレクティブが使えます!

@phpから@endphpで囲った部分は、phpが使えるので以下の様に記述してみます。

test/test.blade.php
@php 
  echo '<pre>'; // 表示を見やすく整形する
  var_dump($user); // user変数を一覧表示する
  echo '<pre>';
@endphp
echo '<pre>'

これを前後に付けることで、var_dumpで一覧表示に改行を入れて見やすくできます。

ブラウザで確認します。

スクリーンショット 2022-03-21 0.17.33.png

見やすく一覧表示できました!

表示の制御方法

ここからは、先ほどの@foreach@phpの様なディレクティブを使って、
渡ってきた変数の表示を制御する方法を紹介します。

ちなみに制御構文はLaravel公式の「制御構文」の部分に分かりやすくまとめられています。

連想配列の値を追加

その前に、連想配列の値をもう少し追加しておきましょう。

VariableController.php
public function test(){
    // title変数を用意
    $title = "ユーザーを全表示";
    // 二次元配列を用意
    $users = [
        [
            'id' => 0,
            'name' => 'テストさん1',
            'gender' => '男性', 
        ],
        [
            'id' => 1,
            'name' => 'テストさん2',
            'gender' => '女性', 
        ],
        [
            'id' => 2,
            'name' => 'テストさん3',
            'gender' => '男性', 
        ],
    ];
    return view('test/test', compact('users', 'title')); // users変数、title変数を渡す
}

user変数をusers変数に変更し、中身を追加しました。
また新たにtitle変数も用意しました。

変数が複数でも、compact関数の場合はコンマで区切ることで複数渡すことができます。

@foreach

配列の中身をループさせるディレクティブです。

今回users変数は二次元配列なので、全ての中身を表示させるには@foreachをネストさせましょう。

test/test.blade.php
@foreach($users as $user)
  @foreach($user as $data)
    {{ $data }}
  @endforeach
  <br>
@endforeach

// 表示
// 0 テストさん1 男性
// 1 テストさん2 女性
// 2 テストさん3 男性

@if @else @elseif

条件に当てはまる場合のみ表示させます。

test/test.blade.php
@if(count($users) === 0)
    <p>ユーザーは0人です</p>
@elseif(count($users) === 1)
  <p>ユーザーは1人います</p>
@else
    <p>ユーザーは2人以上います</p>
@endif

// 表示
// ユーザーは2人以上います。

ループ内で使える$loop変数

ループの中ではループに関する情報を格納している、$loopという便利な変数が使えます。

今回は現在のループを何回繰り返したかを格納しているiterationプロパティを条件式に使ってみます。

test/test.blade.php
@foreach($users as $user)
  <!-- 条件式 ループが2回以降の場合 -->
  @if($loop->iteration > 2)
    <!-- ユーザー情報をループ  -->
    @foreach($user as $data) 
      {{ $data }}
    @endforeach
    <br>
  @endif
@endforeach

// 表示
// 2 テストさん3 男性

他の$loopプロパティは以下になります。

$loop変数のプロパティ一覧

   プロパティ           説明        
$loop->index 現在のループのインデックス(初期値0)
$loop->interation 現在の繰り返し数(初期値1)
$loop->remaining 繰り返しの残り数
$loop->count 繰り返し中の配列の総アイテム数
$loop->first ループの最初の繰り返しか判定
$loop->last ループの最後の繰り返しか判定
$loop->even これは偶数回目の繰り返しか判定
$loop->odd これは奇数回目の繰り返しか判定
$loop->depth 現在のループのネストレベル
$loop->parent ループがネストしている場合、親のループ変数

公式より引用
https://readouble.com/laravel/6.x/ja/blade.html

@empty

変数が空の場合に表示させることもできます。

test/test.blade.php
@empty($title)
 <p>タイトル中身が空</p>
@endempty

// 表示(title変数が空文字列の場合)
// タイトル中身が空

@isset

@issetは変数が存在し、nullではない場合に表示を行います。

test/test.blade.php
@isset($title)
 <p>変数が存在しnullではない</p>
@endisset

// 表示(titleがnullでない場合)
// 変数が存在し、nullではない。

@php

blade内でphp文を書きたい場合は、@phpディレクティブを使います

test/test.blade.php
@php 
  var_dump($users); // phpのvar_dump関数を使いたい
@endphp

ただ、公式より多用するのはあまり良くないとのことです。

この機能を提供していますが、数多く使用しているのであれば、それはテンプレートへ多すぎるロジックを埋め込んでいるサインです。

まとめ

今回はControllerからViewへ変数を渡す方法とその変数の表示制御についてまとめました。

Viewに関する理解はある程度深まったように感じます!

ここまでお読み頂きありがとうございました。

8
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?