How to asign user's role in route prefix in Laravel?

Viewed 31

I've done something like this:

web.php

Route::group(['prefix' => {User Role}, 'middleware' => 'AuthUser:superadmin,admindesa'], function() {
    Route::get('/', 'DashboardC@index');
    Route::get('/penduduk', 'PendudukC@index');
    Route::get('/penduduk/{id}/detail', 'PendudukC@detail');
});

Route::group(['prefix' => 'superadmin', 'middleware' => 'AuthUser:superadmin'], function() {
    Route::get('/pengguna', 'PenggunaC@index');
    Route::get('/pengguna/{id}/edit', 'PenggunaC@edit');
    Route::post('/pengguna/{id}/prosesedit', 'PenggunaC@prosesEdit');
    Route::get('/pengguna/{id}/hapus', 'PenggunaC@hapus');
    Route::post('/ajax/pengguna', 'AjaxC@pengguna');
});

AuthUser.php

class AuthUser
{
    public function handle($request, Closure $next, ...$roles)
    {
        $auth = auth('web')->user();
        if (!$auth || !in_array($auth->role, $roles)){
            \Session::flash('flash_message', array('pesan' => 'Silahkan login untuk melanjutkan', 'tipe' => 'warning'));
            return redirect()->route('login');
        }
        return $next($request);
    }
}

Anyone know what should I write to asign user's role in route prefix? {User Role}

2 Answers

I've found the solution by simply adding role variable to the request

web.php

Route::group(['prefix' => '{role}', 'middleware' => 'AuthUser:superadmin,admindesa'], function() {
    Route::get('/', 'DashboardC@index');
    Route::get('/penduduk', 'PendudukC@index');
    Route::get('/penduduk/{id}/detail', 'PendudukC@detail');
});

Route::group(['prefix' => 'superadmin', 'middleware' => 'AuthUser:superadmin'], function() {
    Route::get('/pengguna', 'PenggunaC@index');
    Route::get('/pengguna/{id}/edit', 'PenggunaC@edit');
    Route::post('/pengguna/{id}/prosesedit', 'PenggunaC@prosesEdit');
    Route::get('/pengguna/{id}/hapus', 'PenggunaC@hapus');
    Route::post('/ajax/pengguna', 'AjaxC@pengguna');
});

AuthUser.php

class AuthUser
{
    public function handle($request, Closure $next, ...$roles)
    {
        $auth = auth('web')->user();
        if (!$auth || !in_array($auth->role, $roles)){
            return redirect()->route('login')->with('gagal','Silahkan login untuk melanjutkan');
        }
        $request->role = $auth->role; // <- this one
        return $next($request);
    }
}

Everytime you want to get {id} in any controller you HAVE to get {role} too like this:

public function detail(Request $request, $role, $id) // <- this one
{
    $penduduk = Penduduk::with(['kabupaten', 'kecamatan', 'kelurahan', 'dusun', 'pendudukjb'])->find($id);
    $bantuan = array_column(json_decode($penduduk->pendudukjb, TRUE), 'id_master_jenis_bantuan');

    $detail = $request->modal ? '_detail' : 'detail';
    return view('penduduk/'.$detail, compact('penduduk', 'bantuan'));
}
//group Auth superadmin and admindesa
Route::middleware(['AuthUser:superadmin,admindesa'])->group(function () { 
     Route::get('/', 'DashboardC@index');
    Route::get('/penduduk', 'PendudukC@index');
    Route::get('/penduduk/{id}/detail', 'PendudukC@detail');
});
Related