Laravel 10.4执行php artisan optimize报错:Cannot redeclare common()
问题分析
你遇到的Cannot redeclare common()错误,本质是**api.php文件被重复加载**,导致全局函数common被多次声明。尽管你只写了一次函数,但Laravel执行optimize命令时,可能因缓存残留、路由注册逻辑重复等原因,多次解析了路由文件。
解决方法
1. 清理旧缓存
先彻底清除所有缓存文件,避免旧的函数定义残留:
php artisan optimize:clear
之后重新运行php artisan optimize,验证是否还报错。
2. 检查路由注册逻辑
打开app/Providers/RouteServiceProvider.php,查看mapApiRoutes方法,确认是否重复调用了loadRoutesFrom:
public function mapApiRoutes() { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); // 确保没有重复的上述路由加载代码 }
若存在重复代码,删除多余部分即可。
3. 避免在路由文件定义全局函数
全局函数易引发命名冲突或重复声明问题,更规范的做法是把路由复用逻辑封装到类中:
- 创建
app/Helpers/RouteHelper.php文件:
namespace App\Helpers; use App\Http\Controllers\AuthController; use Illuminate\Support\Facades\Route; class RouteHelper { public static function common(string $scope) { Route::post('register', [AuthController::class, 'register']); Route::post('login', [AuthController::class, 'login']); Route::middleware(['auth:sanctum', $scope])->group(function() { Route::get('user', [AuthController::class, 'user']); Route::post('logout', [AuthController::class, 'logout']); Route::put('users/info', [AuthController::class, 'updateInfo']); Route::put('users/password', [AuthController::class, 'updatePassword']); }); } }
- 在
api.php中调用静态方法:
use App\Helpers\RouteHelper; RouteHelper::common('你的scope值');
这种方式既避免了全局函数的问题,也让代码结构更清晰。
内容的提问来源于stack exchange,提问作者almiros
相关产品推荐
相关产品推荐

