変数をそのままビューに渡してもいいの？！

<p>「先日書いた記事（以下のリンク）の内容が間違っているのではないか？」
と疑心暗鬼になり、連想配列についてさらに調べてみました。</p>

https://qiita.com/Shuta_Learner/items/71ff522ebf48c022479a

# 変数をそのままビューに渡してもOK?!
<p>前回の記事でコントローラからビューに渡すデータを連想配列としてまとめるのが一般的であるという説明とともに以下のようなコードを載せました。<br>結論から言うと、以下のコードは正しいです。return view内の第二引数のところで、変数($data)をそのままビューに渡す形になっており、連想配列の形では渡していません。<br>しかし、渡している変数が単数です。そして、その変数は配列ではなく連想配列であるため正しいのです。</p><br>

<strong>前回の記事内の記述</strong>

<strong>コントローラ側の記述は以下</strong>
class TestController extends Controller
{
&emsp;public function index(Request $request)
&emsp;{
&emsp;&emsp;`$`data = [
&emsp;&emsp;&emsp;'name' => 'taro',
&emsp;&emsp;&emsp;'city' => 'tokyo',
&emsp;&emsp;&emsp;'sport' => 'soccer',
&emsp;&emsp;&emsp;'age' => 12
&emsp;&emsp;];
&emsp;&emsp;return view('test.index', `$`data);
&emsp;}
}
</p><br>

<strong>ビュー側の記述は以下</strong>
<p>名前：{{ \$name }}</p>
<p>出身：{{ \$city }}</p>
<p>得意なスポーツ：{{ \$sport }}</p>
<p>年齢：{{ \$age }}</p>
<p>
<br>

# ビューに複数の変数を渡す
ただし、複数の変数を渡す場合は連想配列の形で変数をコントローラからビューに渡す必要があるのです。

複数の変数を渡す場合のコードの例を以下に載せておきます。
</p>
<br>

<strong>コントローラ側の記述は以下</strong>
class TestController extends Controller
{
&emsp;public function index(Request `$`request)
&emsp;{
&emsp;&emsp;$data = [
&emsp;&emsp;&emsp;'name' => 'taro',
&emsp;&emsp;&emsp;'city' => 'tokyo',
&emsp;&emsp;&emsp;'sport' => 'soccer',
&emsp;&emsp;&emsp;'age' => 12
&emsp;&emsp;];

&emsp;&emsp;$computer = [
&emsp;&emsp;&emsp;'type' => 'mac',
&emsp;&emsp;&emsp;'year' => 2018
&emsp;&emsp;];

&emsp;&emsp;return view('test.index', ['data' => `$`data, 'computer' => `$`computer]);
&emsp;}
}
<br>

<strong>ビュー側の記述は以下</strong>
`<!-- 名前、出身地、得意なスポーツ、年齢を表示 -->`
<p>名前：{{ $data['name'] }}</p>
<p>出身：{{ $data['city'] }}</p>
<p>得意なスポーツ：{{ $data['sport'] }}</p>
<p>年齢：{{ $data['age'] }}</p>


`<!-- コンピュータの情報を表示 -->`
<p>コンピュータの種類：{{ $computer['type'] }}</p>
<p>年式：{{ $computer['year'] }}</p>

## ビューに渡す変数が配列の場合
<p>
今までの例では、ビューに渡す変数が連想配列の場合を取り扱ってきました。しかし、ビューに渡す変数が配列の場合、return view内の第二引数で、そのまま変数をビューへ渡して良いのでしょうか？<br>答えは、連想配列の形でなければなりません。コードの例を以下に載せておきます。
</p><br>

<strong>コントローラ側の記述は以下</strong>
class TestController extends Controller
{
&emsp;public function index(Request $request)
&emsp;{
&emsp;&emsp;`$`data = [
&emsp;&emsp;[
&emsp;&emsp;&emsp;'name' => 'taro',
&emsp;&emsp;&emsp;'city' => 'tokyo',
&emsp;&emsp;&emsp;'sport' => 'soccer',
&emsp;&emsp;&emsp;'age' => 12
&emsp;&emsp;],
&emsp;&emsp;[
&emsp;&emsp;&emsp;'name' => 'jiro',
&emsp;&emsp;&emsp;'city' => 'osaka',
&emsp;&emsp;&emsp;'sport' => 'baseball',
&emsp;&emsp;&emsp;'age' => 14
&emsp;&emsp;],
&emsp;&emsp;[
&emsp;&emsp;&emsp;'name' => 'hanako',
&emsp;&emsp;&emsp;'city' => 'kyoto',
&emsp;&emsp;&emsp;'sport' => 'basketball',
&emsp;&emsp;&emsp;'age' => 13
&emsp;&emsp;]
&emsp;&emsp;];
&emsp;&emsp;return view('test.index', ['data' => $data]);
&emsp;}
}
</p><br>

<strong>ビュー側の記述は以下</strong><br>
`@`foreach(`$`data as `$`item)
    <p>名前：{{ `$`item['name'] }}
    出身：{{ `$`item['city'] }}
    得意なスポーツ：{{ `$`item['sport'] }}
    年齢：{{ `$`item['age'] }}<p/>
`@`endforeach

## コントローラ側とビュー側で変数名を変更して使用する
<p>
実は、コントローラ側とビュー側で変数名を変更して使用したい場合も、変数($data)をそのままビューに渡す形では正しい記述とならず、連想配列の形で変数をビューに渡さなければなりません。以下のコードの例を記載します。
</p><br>

<strong>コントローラ側の記述は以下</strong>
class TestController extends Controller
{
&emsp;public function index(Request $request)
&emsp;{
&emsp;&emsp;// コントローラ側では$dataを使用
&emsp;&emsp;`$`data = [
&emsp;&emsp;&emsp;'name' => 'taro',
&emsp;&emsp;&emsp;'city' => 'tokyo',
&emsp;&emsp;&emsp;'sport' => 'soccer',
&emsp;&emsp;&emsp;'age' => 12
&emsp;&emsp;];
&emsp;&emsp;// ビューに渡す際にキー名を'userInfo'に変更
&emsp;&emsp;return view('test.index', ['userInfo' => $data]);
&emsp;}
}
</p><br>

<strong>ビュー側の記述は以下</strong>
<p>名前：{{ $userInfo['name']}}</p>
<p>出身：{{ $userInfo['city']}}</p>
<p>得意なスポーツ：{{ $userInfo['sport'] }}</p>
<p>年齢：{{ $userInfo['age'] }}</p>
<p>
<br>

# 連想配列の形で変数をビューに渡すのが間違いない方法！
<p>
結論としては、連想配列の形で変数をビューに渡しておけば間違いないです。一般的にコントローラからビューに変数を渡す際は、連想配列の形で渡しましょうと習うようです。<br>連想配列の形で渡しておけば、コントローラからビューに渡す変数が単数あろうと複数あろうと、変数（自体）が配列であろうと連想配列であろうと正しく動作してくれます。<br>一応、渡す変数が単数かつ変数が連想配列の場合は、直接変数をビューに渡す記述もできるということを知っておけば、直接変数をビューに渡す記述に出くわした際、あたふたすることもないでしょう（笑）。<br>最後に前回の記事で載せたコードの変数を、連想配列の形でビューへ渡すバージョンにして載せておきます。
<br><br>

<strong>コントローラ側の記述は以下</strong>
class TestController extends Controller
{
&emsp;public function index(Request $request)
&emsp;{
&emsp;&emsp;`$`data = [
&emsp;&emsp;&emsp;'name' => 'taro',
&emsp;&emsp;&emsp;'city' => 'tokyo',
&emsp;&emsp;&emsp;'sport' => 'soccer',
&emsp;&emsp;&emsp;'age' => 12
&emsp;&emsp;];
&emsp;&emsp;return view('test.index', ['data' => `$`data]);
&emsp;}
}
<br>


<strong>ビュー側の記述は以下</strong>
名前：{{ `$`data['name'] }}
出身：{{ `$`data['city'] }}
得意なスポーツ：{{ `$`data['sport'] }}
年齢：{{ `$`data['age'] }}
<br>

# 補足：['data' => $data] と compact('data')
<p>
コントローラ側とビュー側で変数名を変更して使用したい場合を先ほど取り上げました。この場合return view内の第二引数を連想配列の形にするということでしたが、この第二引数の部分の書き方は二つのパターンあるのです。<br><br>

<strong>一つ目は、['data' => $data]を使った以下のような書き方</strong>

class TestController extends Controller
{
&emsp;public function index(Request $request)
&emsp;{
&emsp;&emsp;`$`data = [
&emsp;&emsp;&emsp;'name' => 'taro',
&emsp;&emsp;&emsp;'city' => 'tokyo',
&emsp;&emsp;&emsp;'sport' => 'soccer',
&emsp;&emsp;&emsp;'age' => 12
&emsp;&emsp;];
&emsp;&emsp;return view('test.index', ['data' => `$`data]);
&emsp;}
}
<br>

<strong>二つ目は、compact('data')を使った以下のような書き方</strong>

class TestController extends Controller
{
&emsp;public function index(Request $request)
&emsp;{
&emsp;&emsp;`$`data = [
&emsp;&emsp;&emsp;'name' => 'taro',
&emsp;&emsp;&emsp;'city' => 'tokyo',
&emsp;&emsp;&emsp;'sport' => 'soccer',
&emsp;&emsp;&emsp;'age' => 12
&emsp;&emsp;];
&emsp;&emsp;return view('test.index', compact('data'));
&emsp;}
}
<br>


## 'data' => $data] と compact('data')の使い分け

<strong>1.コントローラ側とビュー側で変数名を変更する場合</strong>

['data' => `$`data]を使用します。

例：return view('test.index', ['userInfo' => $data]);<br><br>

<strong>2.変数名を変更する必要がない場合</strong>

compact('data')を使用します。

例：return view('test.index', compact('data'));

compactは、指定した変数名を文字列として受け取り、その変数をキー（名前）と値のペアにして連想配列として作成し、それをビューに渡すための関数です。<br>つまり、compactを使う場合は、コントローラ側とビュー側で'変数名を変更しない'という前提のもとに使われるのです。