Laravelを使っていると、functionの後ろに「use」が記載されたfunction () use ($変数名)
といった表記を見かけることがあります。
ここでは、この「use」とは何なのか?について解説しています。
useとは何か?
function () use ($変数名)
のuseは、関数の外で定義してある変数を使うための宣言です。
LaravelではなくPHPの記述方法です。
useを使わずに、関数の外側にある変数を引数に渡して、関数の中で使おうとすると次のようなエラーが発生します。
ErrorException (E_NOTICE)
Undefined variable: regexs
実例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 );
});
});
});