0

再会

我是 Laravel 的新手,我想创建一个拥有多个用户(学生、主管、HOD)的网站。我想知道是否有办法让所有用户都拥有相同的 URL。以下是我用来尝试实现这一目标的方法:

web.php

// Routes For Students
Route::group(['middleware' => ['auth', 'role:student']], function() {
    Route::get('/home', 'App\Http\Controllers\StudentController@index')->name('student');
    Route::get('/proposal', 'App\Http\Controllers\StudentController@proposal')->name('proposal');
    Route::get('/thesis', 'App\Http\Controllers\StudentController@thesis')->name('thesis');
});

// Routes For Supervisors
Route::group(['middleware' => ['auth', 'role:supervisor']], function() {
    Route::get('/home', 'App\Http\Controllers\supervisorController@index')->name('supervisor');
    Route::get('/proposal', 'App\Http\Controllers\supervisorController@proposal')->name('proposal');
    Route::get('/thesis', 'App\Http\Controllers\supervisorController@thesis')->name('thesis');
});

// Routes For HOD's
Route::group(['middleware' => ['auth', 'role:hod']], function() {
    Route::get('/home', 'App\Http\Controllers\hodController@index')->name('hod');
    Route::get('/proposal', 'App\Http\Controllers\hodController@proposal')->name('proposal');
    Route::get('/thesis', 'App\Http\Controllers\hodController@thesis')->name('thesis');
});

但是我注意到您不能拥有具有相同 URL 的路由,但我希望所有类型的用户在他们各自的主页、提案和论文页面上都具有相同的 URL。这可能吗?

如果您需要更多代码或更好的解释,请告诉我。

4

3 回答 3

0

我建议只为所有这些路由添加一个前缀。这样你就不会得到任何重复的uri。


如果您真的不想这样做,我还有另一种可能,但您将无法保留路线名称。

基本上,使用可调用的控制器重新路由到正确的控制器/动作。

php artisan make:controller -i
Route::group(['middleware' => ['auth']], function () {
    Route::get('/home', 'App\Http\Controllers\MyInvokableController')->name('home');
    Route::get('/proposal', 'App\Http\Controllers\MyInvokableController')->name('proposal');
    Route::get('/thesis', 'App\Http\Controllers\MyInvokableController')->name('thesis');
});
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class MyInvokableController extends Controller
{
    private $lookupArray = [
        'home'     => 'index',
        'proposal' => 'proposal',
        'thesis'   => 'thesis',
    ];

    public function __invoke(Request $request)
    {
        $role = ;// get your user's role
        $urlSegment = $request->segment(count($request->segments()) - 1); // 'home', 'proposal' or 'thesis'

        if ($role === 'student') {
            return app(StudentController::class)->{$this->lookupArray[$urlSegment]}($request);
        } elseif ($role === 'supervisor') {
            return app(supervisorController::class)->{$this->lookupArray[$urlSegment]}($request);
        } elseif ($role === 'hod') {
            return app(hodController::class)->{$this->lookupArray[$urlSegment]}($request);
        } else {
            throw new \Exception("Unexpected role $role.");
        }
    }
}
于 2021-05-16T00:06:33.393 回答
0

如果您需要保持相同的路线,您可以按照@IGP 回答,或者只检查刀片本身的用户角色。

// welcome.blade.php
@role('student')
    <h1>Student welcome page</h1>
@endrole

@role('supervisor')
    <h1>Supervisor welcome page</h1>
@endrole

@role('hod')
    <h1>Hod welcome page</h1>
@endrole
于 2021-05-16T00:14:55.333 回答
0

我认为您最好处理控制器上的逻辑而不是角色中间件。是否有任何主管具有学生“角色”?不,那是因为 Supervisor 不是这里的角色,它是用户类型。所以在这里你想要相同的 URL,这是我更喜欢的:

Route::group(['middleware' => ['auth']], function() {
    Route::get('/home', 'App\Http\Controllers\Controller@index')->name('home');
    Route::get('/proposal', 'App\Http\Controllers\Controller@proposal')->name('proposal');
    Route::get('/thesis', 'App\Http\Controllers\Controller@thesis')->name('thesis');
});

在幕后处理用户类型。

public function index(Request $request) 
{
    // handle the request, determine the user type, populate the proper view, etc.
}

再说角色,

中间件也可以接收额外的参数。例如,如果您的应用程序需要在执行给定操作之前验证经过身份验证的用户是否具有给定的“角色”。Laravel 8 文档 - 中间件

To give an example, you can have say "presenter" role on your application which has a unique URLs and Students and Supervisors are allowed to access them.

Just using Middlewares doesn't mean it would be an efficient solution. As documentation says:

Middleware provide a convenient mechanism for inspecting and filtering HTTP requests entering your application. Laravel Documentation

于 2021-05-16T05:10:25.720 回答