【Laravel】Viewへのデータ伝達をスッキリ書く!compact関数の使い方と連想配列との違い

Laravel

LaravelでコントローラーからBladeテンプレートへ変数を渡す際、コードを簡潔に書ける便利な手段が compact() 関数 です。

「連想配列で渡すのと何が違うの?」「どのような仕組みで動いているの?」という疑問を持つ方向けに、基本的な概念から注意点までを整理して解説します。

1. compact関数とは?

正確には compact() はLaravel独自のヘルパーではなく、PHPの標準関数です。

指定した「変数名(文字列)」を受け取り、その変数名と変数の値をセットにした 連想配列を自動生成する 仕組みを持っています。

仕組みのイメ―ジ

PHP
$name = 'Alice';
$age = 25;

// compact関数を使用
compact('name', 'age');

// 内部的に生成される配列
[
    'name' => 'Alice',
    'age'  => 25,
]

2. Laravelでの主な使い方

コントローラーの view() ヘルパー関数と組み合わせて、Blade側に変数を渡す場面で多用されます。

連想配列で渡す場合(従来の方法)

PHP
public function index()
{
    $posts = Post::all();
    $categories = Category::all();

    return view('posts.index', [
        'posts' => $posts,
        'categories' => $categories,
    ]);
}

compact関数を使って渡す場合

PHP
public function index()
{
    $posts = Post::all();
    $categories = Category::all();

    // 変数名を文字列で渡すだけ
    return view('posts.index', compact('posts', 'categories'));
}

キー名と変数名が全く同じ場合、compact() を使うことでタイピング量を減らし、コードの見通しを良くすることができます。

3. その他の書き方パターン

compact() は引数の渡し方にいくつかバリエーションがあります。

パターンA: カンマ区切りで複数の変数を指定

PHP
return view('user.profile', compact('user', 'status', 'logs'));

パターンB: 配列形式で指定

文字列の配列を渡すことも可能です。条件に応じて渡す変数を動的に切り替えたい場面などで役立ちます。

PHP
$data = ['user', 'status'];
return view('user.profile', compact($data));

4. compact関数を使う際の注意点

非常に便利な compact() ですが、使用する際に気をつけるべきポイントが2点あります。

① 未定義の変数を渡すとエラー(E_WARNING)が発生する

PHP 7.3以降、compact() に存在しない変数名を指定すると E_WARNING が発生します。

変数名のスペルミスには注意しましょう。

PHP
$title = 'Laravel入門';

// $titel は未定義のため警告が発生する
return view('page', compact('titel'));

② キー名と変数名を変更したい場合は使えない

compact() は「変数名 = 配列のキー名」となる仕様です。キー名を変えたい場合は、通常の連想配列(または with() メソッド)を使用する必要があります。

PHP
$userData = User::find(1);

// Blade側で $user として扱いたい場合は連想配列で記述する
return view('user.show', [
    'user' => $userData
]);

5. まとめ

手法メリットデメリット
compact() 関数コードが簡潔になり、記述量が減る変数名とキー名を別々に設定できない
連想配列 ['key' => $val]柔軟にキー名を設定できる変数名と同じキーを並べると冗長になる
  • 変数名とキー名が同じcompact() を使うとスッキリ書ける
  • キー名を別の名前に変更したい = 連想配列 ['key' => $value] を使う

用途に応じて使い分けることで、可読性の高いコントローラーコードを保つことができます。

コメント