Laravel 5.2, 根据用户信息加载视图
Laravel 5.2, Load a view based on user information
这是 Laravel 5.2 的全新安装,我唯一做的就是向 table 用户添加一个新列,这个新列是调用角色,它只是整数...
我想做的是根据此列的信息加载 controller/view...
假设列角色的值为 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'
,它 "works" 但这不是我想要的,我真的不想为用户控制安装第三个包,我只想要一些非常简单的东西...那么我怎样才能做到这一点?...
根据 Matt 所说的(我一开始不明白,我是 laravel 的新手所以请耐心等待),这就是我所做的...
安装新的 laravel...
然后 运行 这个 php artisan make:auth
,它会安装用户需要的所有东西 register/login/reset...
然后打开你的 AuthController.php 改变这个 protected $redirectTo = '/home'
为任何你想要的,在我的例子中我调用了 delegate $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');
}
}
}
这就是你如何根据用户信息获得不同的观点......至少对我有用..
------------更新
在我玩了一会儿之后,我发现即使你为管理员/用户/客户/供应商加载了正确的视图...等 url/path 在这里也是不正确的原因:
使用上面的代码你得到
foo.com/login 当用户加载提供正确视图的委派控制器但 url 保持为 foo.com/delegate 如果用户是admin 我们想要类似 foo.com/admin 而不是 /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']);
});
这样你就可以通过调用 names route return redirect()->route('/myprofile')
...etc
将你的用户重定向到你网站的任何部分
现在这是可行的,我们需要最后检查一下用户正在加载什么,要在每个视图控制器上做到这一点非常简单,你应该有这样的东西......
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!
这是 Laravel 5.2 的全新安装,我唯一做的就是向 table 用户添加一个新列,这个新列是调用角色,它只是整数...
我想做的是根据此列的信息加载 controller/view...
假设列角色的值为 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'
,它 "works" 但这不是我想要的,我真的不想为用户控制安装第三个包,我只想要一些非常简单的东西...那么我怎样才能做到这一点?...
根据 Matt 所说的(我一开始不明白,我是 laravel 的新手所以请耐心等待),这就是我所做的...
安装新的 laravel...
然后 运行 这个 php artisan make:auth
,它会安装用户需要的所有东西 register/login/reset...
然后打开你的 AuthController.php 改变这个 protected $redirectTo = '/home'
为任何你想要的,在我的例子中我调用了 delegate $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');
}
}
}
这就是你如何根据用户信息获得不同的观点......至少对我有用..
------------更新
在我玩了一会儿之后,我发现即使你为管理员/用户/客户/供应商加载了正确的视图...等 url/path 在这里也是不正确的原因:
使用上面的代码你得到
foo.com/login 当用户加载提供正确视图的委派控制器但 url 保持为 foo.com/delegate 如果用户是admin 我们想要类似 foo.com/admin 而不是 /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']);
});
这样你就可以通过调用 names route return redirect()->route('/myprofile')
...etc
将你的用户重定向到你网站的任何部分
现在这是可行的,我们需要最后检查一下用户正在加载什么,要在每个视图控制器上做到这一点非常简单,你应该有这样的东西......
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!