【Laravel】function () use ($変数名)とは何か?意味や使い方を実例で解説|無名関数の外の変数を使う方法とエラーの対処法:ErrorException (E_NOTICE) Undefined variable

laravel-prograshi(プロぐらし) Laravel
記事内に広告が含まれていることがあります。
[PR]

Laravelを使っていると、functionの後ろに「use」が記載されたfunction () use ($変数名)といった表記を見かけることがあります。

ここでは、この「use」とは何なのか?について解説しています。


useとは何か?

function () use ($変数名)のuseは、関数の外で定義してある変数を使うための宣言です。

LaravelではなくPHPの記述方法です。

useを使わずに、関数の外側にある変数を引数に渡して、関数の中で使おうとすると次のようなエラーが発生します。

ErrorException (E_NOTICE)
Undefined variable: regexs
point

PHP(PHPを使ったLaravel)では、関数の外側にある変数を引数に渡したい場合、「use」という記述が必要となる。


実例1

例えば、関数の外で定義している「$slug」という変数を関数の引数に渡して、関数の中の処理で使いたい場合は以下のようにします。

$slug = 'test';

function() use ($slug) {
    Route::get('sitemap-{slug}.xml', 'SitemapController@test')
     ->name('test')
     ->where('slug', $slug);
}

これは、URIがsitemap-test.xmlの時のみ、SitemapControllerのtestアクションを実行する処理になります。


実例2

例えば、関数の外で定義している「$regexs」という変数を関数の引数に渡して、関数の中の処理で使いたい場合は以下のようにします。

$removed_slugs = [ 'aaa', 'bbb',  'ccc' ];
$removed_slugs = implode( '|', $removed_slugs );
$regexs['removed_slugs'] = '(' . $removed_slugs . ')';

Route::get('test/{test_slug}', function() use ($regexs) {
    return redirect( route('test'), 301 );
    })->where('test_slug', $regexs['removed_slugs']  );
});

URIが「test/」の後に、aaa, bbb, cccが来た時のみルート名「test」に301転送をかける設定です。

配列を正規表現の記述に変更するためにimplodeメソッドを使用しています。

implode( '繋ぐ文字列', 配列 )
配列を指定した文字列で繋ぎ合わせて、一つの文字列に変換する

エラーの例

上記の処理でuseを使わずに「$regexs」を使おうとすると以下のようなエラーが発生します。

$slug = 'test';

function($slug) {
    Route::get('sitemap-{slug}.xml', 'SitemapController@test')
     ->name('test')
     ->where('slug', $slug);
}

▼エラーの内容

ErrorException (E_NOTICE)
Undefined variable: regexs


ネストしたfunctionでuseを使う場合

functionの処理の中でfunctionを呼び出すといった処理を行う場合に、一番最下層のfunctionに関数の外にある引数を渡したい場合は、それぞれのfunctionに「use」で使いたい変数を引数に指定していく必要があります。

$slug = 'test';

Route::group(['middleware' => 'auth.very_basic'], function () use ($slug)  {
  Route::group(['prefix' => 'test', 'as' => 'test.'], function() use ($slug)  {
    Route::get('/{test_slug}', function() {
      return redirect( route('test'), 301 );
      })->where('test_slug', $slug  );
    });
  });
});


参考リンク

PHP公式 無名関数

タイトルとURLをコピーしました