Laravel 5.2,根据用户信息加载视图

时间:2016-02-06 10:47:21

标签: php laravel-5.2

这是Laravel 5.2的全新安装,我唯一做的就是向表用户添加一个新列,这个新列是调用角色,它只是整数...
我要做的是根据此列的信息加载控制器/视图...
假设列角色的值为1,则加载视图X
在我的路线文件中我有这个

Route::group(['middleware' => ['web']], function () {
    Route::auth();
if(Auth::user()->roles == '1') {
    Route::get('/admin', 'AdminController@index');
    Route::post('/admin', 'AdminController@save');
    Route::get('/admin/{datas}', 'AdminController@datas');
    Route::get('/admin/list', 'AdminController@list');
    Route::get('/admin/list/{details}', 'AdminController@details');
} else {
    Route::get('/login', 'UsersController@login');
}

如果我在视图中使用此Auth::user()->roles == '1'它“工作”但不是我想要的,我真的不想为用户控制安装第3个软件包,我只想要一些非常简单的东西......所以我怎么能做到这一点?...

1 个答案:

答案 0 :(得分:1)

根据Matt的说法(我一开始并没有得到它,我是laravel的新人,所以请耐心等待),这就是我所做的......
安装新的laravel ...
然后运行此php artisan make:auth,它将安装用户注册/登录/重置所需的一切...
然后打开你的AuthController.php改变这个protected $redirectTo = '/home'你想要的任何东西,在我的情况下我叫了委托$redirectTo = '/delegate'
然后在你的routers.php文件中添加类似的东西

Route::group(['middleware' => ['web']], function () {
    Route::auth();
    Route::get('/delegate', 'DelegateController@index');
});

你实际上并不需要这条路线的视图,你需要的是控制器...
在这个控制器上,DelegateController.php会输出这样的东西

namespace App\Http\Controllers;

use App\Http\Requests;
use Auth;
use Illuminate\Http\Request;


// use App\Http\Controllers\Controller;

class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
    //
    public function index() {
        // TODO Gets Data...
        $datos = ['Nombre', 'Otro Nombre', 'Otro mas'];

        // Return Data to tyhe view...
        if(Auth::user()->roles == '11') {
            return View('admin.home', compact('datos'));
        } else {
            return View('/welcome');
        }
    }
}

那就是你如何根据用户信息获得不同的观点...至少对我有用..

<强> ------------更新

在我玩了一点之后,我发现即使你为admin / user / customers / providers ...等加载了正确的视图,url / path也不正确,这就是原因:
使用上面的代码,当用户加载提供正确视图的委派控制器时,你会得到
foo.com/login,但如果用户是管理员,我们需要像foo.com/这样的网址保持为foo.com/delegate admin not / delegate,即使你手动将其从/ delegate更改为/ admin它仍然可以工作,但这是问题,因为如果用户不是管理员,它仍然会显示管理面板,我们不希望这样...修复我必须更改我的委托控制器...而不是加载视图我必须将用户重定向到正确的路径...

public function index() {
    if(Auth::user()->roles == '10') {
         return redirect()->route('admin');
        } else {
         return redirect()->route('/');
        }
    }

这是与以前相同的代码,但不是加载视图而是重定向用户,为了使其在您的路径文件中正常工作,您必须声明每个路径的名称,如下所示

Route::group(['middleware' => ['web']], function () {
    Route::auth();
    Route::get('delegate', 'DelegateController@index');
    // Add your route
    // Route::get('admin', 'AdminController@home');
    Route::get('admin', ['as'=>'admin', 'uses'=>'AdminController@home']);
});

通过调用名称路由return redirect()->route('/myprofile')等,您可以将用户重定向到您网站的任何部分。 现在这个工作正常,我们需要做最后一次检查,看看用户正在加载什么,要做到这一点非常简单,你应该在每个视图控制器上都有这样的东西......

class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        // gets the disco bouncer working...
        if(Auth::user()->roles != '10') {
            Auth::logout();
        }

    }
    //
    public function home() {
        // TODO Gets Data...
        $datos = ['Nombre', 'Otro Nombre', 'Otro mas'];
        // TODO build a model for the actual data...
        // Return Data to the view...
        return View('admin.home', compact('datos'));

    }
}

正如您所看到的,我们可以在所有控制器上使用它并跳过DelegationController,但是您必须在单个app.blade主视图上为每个用户角色做一个菜单,这看起来会更脏...
如果你问我,是的,我很开心学习Laravel!