假设我们正在构建一个包含两种用户的应用 - OfficeStaff
和Engineer
。我们希望他们在登录后都将/dashboard
作为主要登录页面,但他们都应该看到完全不同的东西。
我们对两者都使用users表,因为它们都以相同的方式登录,并创建一个角色字段来确定谁是OfficeStaff以及谁是工程师。
当我们创建路线时,我首先想到的是:
Route::group( [ ‘middleware’ => ‘role:office-staff’ ] , function () {
Route::get( ‘dashboard’, function() { return ‘Office staff dash’; } );
} );
Route::group( [ ‘middleware’ => ‘role:engineer’ ] , function () {
Route::get( ‘dashboard’, function() { return ‘Engineer dash’; } );
} );
然而问题是Laravel在编译路线时不会考虑中间件 - 它只是查看路径,因此第二条路线覆盖第一条路线而我们没有办公室工作人员的仪表板路线。 / p>
由于路径文件是在中间件运行之前加载的,因此Auth中间件不会加载到当前用户中,所以我们不能像这样动态命名路由:
Route::get( ‘dashboard’, [ ‘as’ => ‘dashboard’, ‘uses’ => Auth::user()->role . ‘\DashboardController@dashboard’ ] );
我遇到的另一种方法是在控制器中检测它然后创建相应子控制器的新控制器实例...
public function dashboard( Request $request ) {
App::make( ‘App\Controllers\’ . $request->user()->role . ‘DashboardController’ )->dashboard();
}
但感觉就像我们进入一个受伤的世界,我们失去了在控制器方法中输入提示的能力,而且我们将会有很多这样的通用控制器动作。
在完成所有这些之后,我想不出一个好的,干净的方式来设置它。有任何想法吗? :)