以前の記事(以下のリンク先の記事)でLaravelの内部動作について少し書きました。その記事では、連想配列が格納された変数自体(つまり、連想配列の形で渡された変数ではない)がそのままコントローラからビューへ渡されたケースについて触れました。今回は、配列の中に連想配列が格納された変数におけるLaravelの内部動作について紹介します。
連想配列の形で渡された変数
前提として、基本的には連想配列の形でコントローラからビューへ変数が渡されます。例えば以下のような記述です。
コントローラ側の記述は以下
class TestController extends Controller
{
public function index(Request $request)
{
$
data = [
[
'name' => 'taro',
'city' => 'tokyo',
'sport' => 'soccer',
'age' => 12
],
[
'name' => 'jiro',
'city' => 'osaka',
'sport' => 'baseball',
'age' => 14
],
[
'name' => 'hanako',
'city' => 'kyoto',
'sport' => 'basketball',
'age' => 13
]
];
return view('test.index', ['data' => $data]);
}
}
ビュー側の記述は以下
@
foreach($
data as $
item)
名前:{{ $
item['name'] }}
出身:{{ $
item['city'] }}
得意なスポーツ:{{ $
item['sport'] }}
年齢:{{ $
item['age'] }}
@
endforeach
上記の記述の場合、なぜビュー側で'name'や'city'といったコントローラ側で定義された連想配列のキーが使用できるのでしょうか?
データバインディング
実は、Laravelのデータバインディングという仕組みが鍵を握っています。
データバインディングとは、コントローラで準備したデータがビュー内でそのまま変数として利用できる仕組みのことです。そして、
もしそのデータが連想配列であれば、そのキーを使ってビュー内で中身(値)にアクセスすることができるようになります。
もう一度先ほどの記述を見ていきます。
コントローラ側の記述は以下
class TestController extends Controller
{
public function index(Request $request)
{
$
data = [
[
'name' => 'taro',
'city' => 'tokyo',
'sport' => 'soccer',
'age' => 12
],
[
'name' => 'jiro',
'city' => 'osaka',
'sport' => 'baseball',
'age' => 14
],
[
'name' => 'hanako',
'city' => 'kyoto',
'sport' => 'basketball',
'age' => 13
]
];
return view('test.index', ['data' => $data]);
}
}
コントローラ内で複数の連想配列が格納された配列が$
dataという変数として定義されています。そして、return viewの第二引数の部分で、その変数が連想配列の形でビューへと渡されています。ここで、データバインディングの登場です!
ビュー側の記述は以下
@
foreach($
data as $
item)
名前:{{ $
item['name'] }}
出身:{{ $
item['city'] }}
得意なスポーツ:{{ $
item['sport'] }}
年齢:{{ $
item['age'] }}
@
endforeach
ビュー内のforeachの中で$
dataとありますが、これはデータバインディングにより、コントローラ内で準備した変数が使えるからであり、正しいと記述となります。
次に$
itemとありますが、こちらにコントローラ側で準備された連想配列が代入されています。そしてこれもデータバインディングの仕組みにより、例えば、{{ $
item['name'] }}というように、キーである'name'を使って値('taro'、'jiro'、'hanako')にアクセスすることができるのです。