Как использовать один Laravel контроллер с множественной защитой вместо дублирования контроллера - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть два охранника

Admin
User

Также я создал контроллеры, где пользователь может управлять своими собственными данными, а администратор также может управлять пользовательскими данными. Таким образом, я создал два контроллера

Controllers
    Admin
        EducatonBackgroundController
    User
        EducationBackgroundController

В User / EducationBackgroundController у меня есть эта функция, которая выбирает фон образования текущего зарегистрированного пользователя и отображает в представлении пользователя

 public function index(Education $education)
    {
        try {
            $educations = $education->where('user_id',$this->userLoggedID())->with('organization','program','country','city')->get();
            return view('users.education.index',compact('educations'));
        }
        catch (Exception $e) {
            abort(404);
        }
    }

В Admin / EducationBackgroundController У меня есть эта функция, которая извлекает сведения об образовании всех пользователей и отображает в представлении администратора

 public function index(Education $education)
    {
        try {
            $educations = $education->with('organization','program','country','city','user')->get();
            return view('admin.users.education.index',compact('educations'));
        }
        catch (Exception $e) {
            abort(404);
        }
    }

Из наблюдения эти функции похожи, но различаются при возврате представления и извлечении данных.

Так как можно я создаю один контроллер, который может использоваться как администратором, так и пользователем, вместо дублирования контроллера и вида для обеих охранников.

1 Ответ

1 голос
/ 21 апреля 2020

Я сделал что-то похожее, добавив второй набор маршрутов, например:

<?php

    Route::middleware(['auth:admin_api'])->group(function () {
        Route::prefix('admin')->group(function () {
            Route::name('api.admin.')->group(function () {

                ////////////////////////////////////////////////////////////
                /// PLACE ADMIN API ROUTES HERE ////////////////////////////
                ////////////////////////////////////////////////////////////
                Route::apiResource('test','App\Http\Controllers\API\MyController');
                ////////////////////////////////////////////////////////////
            });
        });
    });

    Route::middleware(['auth:api'])->group(function () {
        Route::name('api.')->group(function () {
            ////////////////////////////////////////////////////////////
            /// PLACE PUBLIC API ROUTES HERE ///////////////////////////
            ////////////////////////////////////////////////////////////
            Route::apiResource('test', 'App\Http\Controllers\API\MyController');
            ////////////////////////////////////////////////////////////
        });
    });

Поэтому, когда пользователь с правами администратора переходит к admin / test, он использует admin auth guard, а когда обычный пользователь идет в / test, он использует стандартную аутентификацию. Оба они используют один и тот же контроллер.

Затем я создал базовый контроллер для своего приложения. Вот как я определил с помощью guard для доступа к маршруту в конструкторе:

<?php


use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class BaseController extends Controller
{
    protected $user;

    protected $isAdmin = false;

    public function __construct()
    {
        if(Auth::guard('admin_api')->check()) {
            $this->user = Auth::guard('admin_api')->user();
            $this->isAdmin = true;
        } elseif(Auth::guard('api')->check()) {
            $this->user = Auth::guard('api')->user();
            $this->isAdmin = false;
        } else {
            return response()->json([
                'message' => 'Not Authorized',
            ], 401);
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...