Projede birden fazla departman var ve bu departmanların route dosyaları ayrılmış durumda. Örneğin routes/admin.php
, routes/staff.php
, routes/support.php
gibi. Her departman kendi içinde bir rol yetki sistemine sahip ve bununla beraber her birinin temaları farklı.
Amacım 403 sayfasını global olarak yakalayıp kendi temalarıyla 403 sayfasını göstermek. Bununla beraber hangi yetkiye ihtiyacı olduğunu da söylemek.
Şu an rol yetki sistemini Authorization ile sağlıyorum. Örnek AuthServiceProvider
dosyası şöyle;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
if (!App::runningInConsole()) {
try {
$permissions = Permission::get();
foreach ($permissions as $permission) {
Gate::define($permission->slug, function ($user) use ($permission) {
return $user->role->permissions()->pluck('slug')->contains($permission->slug);
});
}
} catch (\Exception $e) {
return [];
}
}
}
}
Controller içinde yetkiyi $this->authorize('permission_show');
şeklinde kontrol ediyorum ve 403 durumunu da App\Exceptions\Handler
içinde render metoduyla yakalıyorum.
public function render($request, Throwable $exception){
if ($exception instanceof AuthorizationException) {
$parts = explode('.', $request->route()->getName());
if (isset($parts[0])){
$errorView = "{$parts[0]}.error.pages.403";
if (view()->exists($errorView)){
$requiredPermission = $request->...->requiredPermission(); // 'some_permission'
return response()->view($errorView, [
'requiredPermission' => $requiredPermission
], 403);
}
}
}
return parent::render($request, $exception);
}
Yukarıda görüldüğü gibi view konusunu çözdüm ama o an gereken yetkiyi bir türlü elde edip gösteremedim. Bu nasıl yapılabilir?