【问题标题】:Laravel5: Conditional Routing (to make /usernickname pages)Laravel5:条件路由(制作 /usernickname 页面)
【发布时间】:2016-11-21 10:40:30
【问题描述】:

在 laravel 5 中,如果用户存在,我想将 www.example.com/username 响应路由到用户个人资料页面,就像 twitter、facebook 一样。当然我有 /blabla 这样的页面,但我不允许用户有 'blabla' 作为用户名。

在这种情况下,我尝试了很多东西,但最后一个是:中间件。 中间件对我来说是最好的,但在这种情况下,用户身份验证丢失了。如果我在控制器中使用类似 Auth::id() 的东西,我会得到错误。当我打印 dd(Auth::user()) 时,我只会得到 null。

顺便说一句,如果我切换到 www.example.com/ 或 www.example.com/blabla 等,则没有 Auth 问题。只有中间件会导致 Auth 问题。

我的中间件:

  class UserMiddleware
{

    public function handle($request, Closure $next)
    {

            if (User::where('username', $request->path())->exists()) {
                $controller = App::make('App\Http\Controllers\UserController');
                return Response::make($controller->callAction('index',array()));
                //return $controller->callAction('index',array());
            }


        return $next($request);
    }
}

内核.php:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\UserMiddleware::class,
];

控制器:

public function index()
{
    //$user=Auth::user()->id;
    return view('front.user.profile',['user'=>Auth::user()]);
}

在视图中:

{{dd($user)}}

我怎样才能克服丢失 Auth 的问题,或者你告诉我如何用另一种方式解决它?

【问题讨论】:

    标签: laravel-5.2 laravel-routing laravel-middleware


    【解决方案1】:

    我有另一种方法给你。我在数据库中创建了一个配置文件表,其中包含字段 id、user_id 和用户名。然后我在模型中添加以下关系。
    用户模型

        public function profile()
        {
            return $this->hasOne('App\Profile');
        }
    

    个人资料模型

        public function user()
        {
            return $this->belongsTo('App\User');
        }
    

    ProfilesController 中添加以下内容:

        public function __construct()
        {
            $this->middleware('auth');
        } 
    
    
        public function show($username)
        {
    
            $profile = Profile::where('username', $username)->first();
    
            return view('front.user.profile', compact('profile'));
        }
    

    不要忘记在控制器中使用 App\Profile;
    在你的视图中,你可以做这样的事情:

    Auth::user()->profile->username
    

    【讨论】:

    • 感谢您的回答,我解决了添加 Route::get('/{user?}', 'UserController@index'); 的问题行到 routes.php 的底部。 Laravel 尝试路由所有其他路由,如果最后失败,它会尝试转到 /{user?} 路由。而且总有一条 /{user?} 路线:)
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2016-01-22
    • 2017-07-07
    • 2023-03-04
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多