You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel如何定义以@为前缀的路由(如myapp.com/@username)

在Laravel中定义带@前缀的用户路由

嘿,这个需求在Laravel里实现起来超直接,我来给你拆解具体的实现方式:

基础路由定义

首先,你可以直接把@作为路由路径的一部分,后面跟上用户名字段参数。因为在路由路径里,@只是普通字符(它只有在指定控制器方法时才会被解析为分隔符),所以不需要额外转义,直接写就行:

// routes/web.php
Route::get('/@{username}', function ($username) {
    // 这里写你的业务逻辑,比如根据用户名查询用户
    $user = \App\Models\User::where('username', $username)->firstOrFail();
    return view('user.profile', compact('user'));
});

给参数加正则约束(推荐)

为了避免匹配到不符合规则的用户名(比如包含特殊符号的情况),可以给username参数添加正则约束,限定它只能是字母、数字或下划线:

Route::get('/@{username}', function ($username) {
    // 逻辑处理
})->where('username', '[a-zA-Z0-9_]+');

如果是用控制器类来处理逻辑,写法也类似:

use App\Http\Controllers\UserProfileController;

Route::get('/@{username}', [UserProfileController::class, 'show'])
    ->where('username', '[a-zA-Z0-9_]+')
    ->name('user.profile'); // 给路由命名方便后续生成URL

注意路由匹配顺序

Laravel是按照路由定义的先后顺序进行匹配的,所以如果你的应用里有其他带@前缀的特殊路由(比如/@admin),一定要把这些更具体的路由放在通用的/@username路由前面,否则特殊路由会被通用路由抢先匹配:

// 先定义特殊路由
Route::get('/@admin', [AdminController::class, 'dashboard']);

// 再定义通用的用户路由
Route::get('/@{username}', [UserProfileController::class, 'show'])
    ->where('username', '[a-zA-Z0-9_]+');

生成路由URL

给路由命名后,你可以用route()助手快速生成带@前缀的用户URL:

// 生成类似 /@johndoe 的URL
$profileUrl = route('user.profile', ['username' => 'johndoe']);

这样就完美实现了像medium.com/@{username}一样的路由形式啦!

内容的提问来源于stack exchange,提问作者Saurabh Mistry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:35:36