我正在尝试使用以下路线来捕获www.example.com/@username等网址,但它会给我404错误。
Route::get('{user}', 'UserController@showProfile')->where('user', '(?<=\s|^)@([\w@]+)');
正则表达式工作正常,因为如果我使用以下路由它会输出正确的结果。
Route::get('{user}', 'UserController@showProfile')
和
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
class UserController extends Controller
{
public function showProfile($user)
{
$out = array();
$re = "/(?<=\\s|^)@([\\w@]+)/";
preg_match_all($re, $user, $out);
dd($out);
}
}
我做错了什么?
答案 0 :(得分:1)
从路由正则表达式中删除lookbehind和捕获组。尽量使用最简单的解决方案,例如^@[\w]+$
。由于您的路线始终以 @ 开头,而不是捕获用户名,因此您可以$user = substr($user, 1);
。
我还建议使用路由模型绑定,这样您就可以直接在控制器中拥有现有用户的实例。在 RouteServiceProvider @ boot 中添加以下内容:
$router->bind( 'user', function ( $username ) {
return User::whereUsername( substr($username, 1) )->firstOrFail();
});
然后在您的控制器中,您的方法将如下所示:
public function showProfile( User $user ){ ...