#laravel #laravel-5 #laravel-5.8
#laravel #laravel-5 #laravel-5.8
Вопрос:
Я создаю логику, в которой контроллер может вызывать другой контроллер в зависимости от роли Auth:: user (), но не все контроллеры используют один и тот же метод, поэтому я хочу, чтобы, если контроллер вызывает метод, который не существует, он выдаст 404 not found. вот мой контроллер
class LokalController extends Controller
{
/**
* Display a listing of the resource.
*
* @return IlluminateHttpResponse
*/
Public $controller;
public function __construct()
{
//$this->middleware('adminakses');
$this->middleware(function ($request, $next) {
$this->setController();
return $next($request);
});
}
public function setController()
{
$role = Auth::user()->role;
switch ($role)
{
case 'admin':
$this->controller = new SIAHttpControllersAdminLokalController;
break;
case 'guru':
$this->controller = new SIAHttpControllersGuruLokalController;
break;
case 'siswa':
$this->controller = new SIAHttpControllersGuruLokalController;
break;
}
}
public function index()
{
return $this->controller->index();
}
например, у Admin LokalController есть метод A(), а у Guru LokalController его нет, и если пользователь вошел в систему как guru и пытается вызвать метод A (), он должен возвращать не найденное исключение или что-то понятное пользователю сообщение, но в настоящее время показывает, что метод A BADMETHOD callexception () не существует
Ответ №1:
Подход, который вы пытаетесь использовать, достижим, но я думаю, что со временем это будет непосильным.
public function index()
{
try {
$action = $this->controller . '@' . __FUNCTION__;
action($action);
} catch (Exception $e) {
abort('401', "Your Message");
}
}
Вместо этого я бы сделал это так, я бы создал путь перенаправления для пользовательской модели.
public function getRedirectPathAttribute() {
switch ($this->role) {
case 'admin':
return '/admin';
case 'guru':
return '/guru';
case 'siswa':
return '/siswa';
}
}
А затем создайте промежуточное программное обеспечение для проверки, и если потребуется перенаправление, я бы перенаправил с помощью auth()->user()->redirect_path
.
Что вы думаете?
Комментарии:
1. Поскольку я не хочу менять маршрут, и другая роль может получить доступ к sam URL, я думаю, будет лучше, если мы обработаем все внутри контроллера без перенаправления.
2. Кстати, ваше решение по-прежнему возвращает исключение BADMETHOD Callexception
Ответ №2:
Одним из вариантов является наличие контроллера, от которого наследуются все эти контроллеры, который реализует все методы, вызывая App::abort(404), и в каждом из дочерних классов реализует необходимые им методы, останавливая вызов методов в родительских классах
class BaseController extends Controller{
public function a() {
App::abort(404);
}
}
class AdminController extends BaseController{
public function a() {
// to stuff for admin
}
}
Контроллеры, наследующие от BaseController, которые не реализуют a(), получат 404, контроллер администратора не получит