ある日、php artisan config:cache
を叩くとこんなエラーが発生しました。
$ php artisan route:cache
Route cache cleared!
PHP Fatal error: Cannot redeclare defaultRoutes() (previously declared in /app/hogehoge/app/Http/routes.php:35) in ...
エラーの内容を見ていると、defaultRoutes()
が再定義されているよ!というものでした。
このdefaultRoutes()
というのは、routes.phpで定義してる基本的なルーティングの設定をまとめたメソッドになっています。
具体的には、下記のようにルーティングが記述されていました。
※一部省略しています
if (strpos(url(), config('app.test_domain'))) {
Route::group(['middleware' => 'auth'], function () {
defaultRoutes();
});
} else {
defaultRoutes();
}
/*
* 通常のrouteを定義
*/
function defaultRoutes ()
{
Route::get('/hogehoge', 'HogeController@index');
}
この処理では、テストドメインでアクセスした際はBASIC認証を掛け、それ以外のドメインのアクセスの際には、BASIC認証を掛けずにページにアクセスできるようにしています。
通常のルートをdefaultRoutes()
で定義して、それを呼び出すような処理にしていました。
もちろん、この書き方で正しくルーティングされており、実際にページにアクセスしてもエラーが出ることはありませんでした。
しかし、このままだとphp artisan config:cache
やphp artisan route:cache
を叩こうとすると、タイトルのようなエラーが出てしまうようです。
この問題は、クロージャーを使用するように修正することで解決できました
php - Cannot redeclare Laravel routes method duplication on phpunit - Stack Overflow
/*
* 通常のrouteを定義
*/
$defaultRoutes = function(){
Route::get('/hogehoge', 'HogeController@index');
};
if (strpos(url(), config('app.test_domain'))) {
Route::group(['middleware' => 'auth'], $defaultRoutes);
} else {
$defaultRoutes();
}