Displaying views in laravel based on userype

60 views Asked by At

I am trying to display different views depending on the type of user who logs in. If an admin logs in I want the admin dashboard to be displayed while if the customer logs in I want the website to be displayed. Following is my code:

web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CustomerInquiryController;
use App\Http\Controllers\SupplierController;
use App\Http\Controllers\ProductController;
use App\Http\Controllers\employeeController;
use App\Http\Controllers\CustomerController;
use App\Http\Controllers\rewardsprogramController;
use App\Http\Controllers\giftcardController;
use App\Http\Requests\UpdaterewardsprogramRequest;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('/login', function () {
    return view('auth.login');
});

Route::get('/register', function () {
    return view('auth.register');
});

Route::get('/main', function () {
    return view('main');
});

Route::get('/feedback', function () {
    return view('feedback');
});

// Route::get('/signin', function () {
//     return view('signin');
// });

// Route::get('/signup', function () {
//     return view('signup');
// });

Route::get('/admin_main', function () {
    return view('admin_main');
});

Route::get('/product_main', function () {
    return view('product_main');
});

Route::get('/product_add', function () {
    return view('product_add');
});

Route::get('/product_manage', function () {
    return view('product_manage');
});

Route::get('/product_edit', function () {
    return view('product_edit');
});

Route::get('/supplier_main', function () {
    return view('supplier_main');
});

Route::get('/supplier_add', function () {
    return view('supplier_add');
});

Route::get('/supplier_manage', function () {
    return view('supplier_manage');
});

Route::get('/supplier_edit', function () {
    return view('supplier_edit');
});

Route::get('/employee_main', function () {
    return view('employee_main');
});

Route::get('/employee_add', function () {
    return view('employee_add');
});

Route::get('/employee_manage', function () {
    return view('employee_manage');
});

Route::get('/employee_edit', function () {
    return view('employee_edit');
});

Route::get('/customer_main', function () {
    return view('customer_main');
});

Route::get('/customer_add', function () {
    return view('customer_add');
});

Route::get('/customer_manage', function () {
    return view('customer_manage');
});

Route::get('/customer_edit', function () {
    return view('customer_edit');
});

Route::get('/reward_main', function () {
    return view('reward_main');
});

Route::get('/reward_add', function () {
    return view('reward_add');
});

Route::get('/reward_manage', function () {
    return view('reward_manage');
});

Route::get('/reward_edit', function () {
    return view('reward_edit');
});

Route::get('/reward_main', function () {
    return view('reward_main');
});

Route::get('/gift_add', function () {
    return view('gift_add');
});

Route::get('/gift_manage', function () {
    return view('gift_manage');
});

Route::get('/gift_edit', function () {
    return view('gift_edit');
});


//Creating hyperlinks
// Route::get('main', function () {
//     return view('main');
// });

//Retrieving form data and storing it
// Route::post('/main', 'CustomerInquiryController@store');
Route::post('/feedback', [CustomerInquiryController::class, 'store']);
Route::post('/supplier_add', [SupplierController::class, 'store']);
Route::post('/product_add', [ProductController::class, 'store']);
Route::post('/employee_add', [employeeController::class, 'store']);
Route::post('/customer_add', [CustomerController::class, 'store']);
Route::post('/reward_add', [rewardsprogramController::class, 'store']);
Route::post('/gift_add', [giftcardController::class, 'store']);


//Updating form data and storing it
//Route::get('/items', [ItemController::class, 'index']); // Retrieve data
//Route::get('/reward_edit/{id}', [rewardsprogramController::class, 'edit']); // Edit form
Route::get('/reward_edit/{id}', [rewardsprogramController::class, 'edit'])->name('reward_edit');
Route::put('/reward_manage/{id}', [rewardsprogramController::class, 'update'])->name('reward_manage'); // Update data

Route::get('/customer_edit/{id}', [CustomerController::class, 'edit'])->name('customer_edit');
Route::put('/customer_manage/{id}', [CustomerController::class, 'update'])->name('customer_manage');

Route::get('/employee_edit/{id}', [employeeController::class, 'edit'])->name('employee_edit');
Route::put('/employee_manage/{id}', [employeeController::class, 'update'])->name('employee_manage');

Route::get('/gift_edit/{id}', [giftcardController::class, 'edit'])->name('gift_edit');
Route::put('/gift_manage/{id}', [giftcardController::class, 'update'])->name('gift_manage');

Route::get('/product_edit/{id}', [ProductController::class, 'edit'])->name('product_edit');
Route::put('/product_manage/{id}', [ProductController::class, 'update'])->name('product_manage');

Route::get('/supplier_edit/{id}', [SupplierController::class, 'edit'])->name('supplier_edit');
Route::put('/supplier_manage/{id}', [SupplierController::class, 'update'])->name('supplier_manage');

// Route::put('/reward_edit/{reward_program_id}', [rewardsprogramController::class, 'update'])->name('reward_update');
// Route::get('/reward_edit/{id}/edit', [rewardsprogramController::class, 'edit'])->name('reward_edit.edit');
// Route::put('/reward_edit/{id}', [rewardsprogramController::class, 'update'])->name('reward_edit.update');
// Route::get('/reward_edit', [rewardsprogramController::class, 'edit'])->name('reward_edit.edit');
// Route::put('/reward_edit', [rewardsprogramController::class, 'update'])->name('reward_edit.update');



//Retrieving table data and displaying it
Route::get('/admin_main', [ProductController::class, 'display']);
// Route::get('/main', [ProductController::class, 'mainview']);

Route::get('/product_manage', [ProductController::class, 'index']);
Route::get('/supplier_manage', [SupplierController::class, 'index']);
Route::get('/employee_manage', [employeeController::class, 'index']);
Route::get('/customer_manage', [CustomerController::class, 'index']);
Route::get('/reward_manage', [rewardsprogramController::class, 'index']);
Route::get('/gift_manage', [giftcardController::class, 'index']);

//Deleting table data
Route::delete('/product_manage', [ProductController::class, 'delete']);
Route::delete('/supplier_manage', [SupplierController::class, 'delete']);
Route::delete('/employee_manage', [employeeController::class, 'delete']);
Route::delete('/customer_manage', [CustomerController::class, 'delete']);
Route::delete('/reward_manage', [rewardsprogramController::class, 'delete']);
Route::delete('/gift_manage', [giftcardController::class, 'delete']);

Auth::routes();

//Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');


Route::middleware(['auth', 'admin'])->name('admin_')->prefix('admin')->group(function() {
    Route::get('/admin_main',[App\Http\Controllers\Admin\AdminController::class,'index'])->name('main');
});

main_template2.blade.php

@guest
                        @if (Route::has('login'))
                        <li class="nav-item">
                            <a class="nav-link ms-5" href="{{ route('login') }}">{{ __('Login') }}</a>
                        </li>
                        @endif

                        @if (Route::has('register'))
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
                        </li>
                        @endif
                        @else
                        <li class="nav-item dropdown">
                            <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                                {{ Auth::user()->name }}
                            </a>

                            <div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
                                <a class="dropdown-item" href="{{ route('logout') }}"
                                    onclick="event.preventDefault();
                                                    document.getElementById('logout-form').submit();">
                                    {{ __('Logout') }}
                                </a>

                                <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
                                    @csrf
                                </form>
                            </div>
                        </li>
                        @endguest

Kernel.php

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's middleware aliases.
     *
     * Aliases may be used to conveniently assign middleware to routes and groups.
     *
     * @var array<string, class-string|string>
     */
    protected $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'admin' => \App\Http\Middleware\Admin::class,
    ];
}

Databaseseeder.php

    <?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $this->call(Admin::class);
        // \App\Models\User::factory(10)->create();

        // \App\Models\User::factory()->create([
        //     'name' => 'Test User',
        //     'email' => '[email protected]',
        // ]);
    }
}

Admin.php middleware

    <?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class Admin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        // if (Auth::check() && Auth::user()->is_admin) {
        //     return $next($request);
        // }
        // abort(403, 'Unauthorized');

        if (!auth()->check() || !auth()->user()->is_admin) {
            abort(403);
        }
        return $next($request);
    }
}

Admin.php seeder

 <?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\User;
use Illuminate\Support\Str;

class Admin extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        User::create([
            'name' => 'Admin',
            'email' => '[email protected]',
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi',
            'remember_token' => Str::random(10),
            'is_admin' => 1
        ]);
    }
}

AdminController.php

    <?php

namespace App\Http\Controllers\Admin;

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

class AdminController extends Controller
{
    public function index(){
        return view('admin_main');
    }
}
1

There are 1 answers

0
BigBear On

Instead of using middleware to return a view, I believe you should use the middleware to redirect to a route and then return a view from your controller as usual. For example, if you detect the user is an admin, you redirect him to a different route than when you detect he is not an admin.

I believe your middleware should be as follows:

public function handle(Request $request, Closure $next): Response
{
    if (!auth()->check()) {
        abort(403);
    }
    else if(!auth()->user()->is_admin) 
    {
        // -> return to regular user route
    }
    else {
        return $next($request);
    }
}