
Laravel中定义路由时,若在Route::get()等方法中混用命名参数(如uri: 'scraper')和位置参数(如数组控制器动作),PHP会抛出“Cannot use positional argument after named argument”错误,需统一使用位置参数语法。
laravel中定义路由时,若在`route::get()`等方法中混用命名参数(如`uri: 'scraper'`)和位置参数(如数组控制器动作),php会抛出“cannot use positional argument after named argument”错误,需统一使用位置参数语法。
在 Laravel 的 routes/web.php 文件中,路由定义应严格遵循框架约定的函数签名。Route::get() 方法的签名是:
Route::get(string $uri, array|callable $action): \Illuminate\Routing\PendingRoute
它仅接受两个位置参数:第一个是 URI 字符串,第二个是控制器方法数组或闭包。PHP 8.0+ 虽支持命名参数,但此处不能为部分参数加命名标签(如 uri: 或 name:),因为一旦使用了命名参数,其后所有参数都必须为命名形式——而 Route::get() 并未声明可接受命名参数(即方法签名中无参数名注解),强行使用 uri: 或 name: 会导致语法错误。
✅ 正确写法(纯位置参数):
Route::get('scraper', [App\Http\Controllers\ScraperController::class, 'scraper'])->name('scraper');
⚠️ 错误写法(混用命名与位置参数):
// ❌ 报错:Cannot use positional argument after named argument Route::get(uri: 'scraper', ["App\Http\Controllers\ScraperController"::class, 'scraper'])->name(name:'scraper');
注意以下几点:
- 控制器类名无需引号包裹(App\Http\Controllers\ScraperController::class 是常量表达式,非字符串);
- ->name('scraper') 是链式调用方法,不是 Route::get() 的参数,因此它不受前述命名参数限制;
- 若需显式指定中间件、域名等高级选项,应使用 Route::middleware()、Route::domain() 等链式方法,而非尝试用命名参数传入。
总结:Laravel 路由构造器(如 Route::get, Route::post)目前不支持命名参数语法,务必坚持位置参数顺序——URI 在前,动作在后;所有配置均通过链式方法(->name(), ->middleware(), ->where() 等)追加。这是兼容性与可读性的最佳实践。










