簡體   English   中英

Laravel中的命名空間控制器和路由

[英]Namespaced controllers and routes in laravel

假設我有一個模型“ Post”,並為其創建了兩個資源控制器-User / PostController和Admin / PostController。

因此,當我希望消耗資源時,我的路線將如下所示:

/user/post/:id
/admin/post/:id

按照慣例,這是正確的還是我做錯了?

建議為其控制器使用單獨的模型,反之亦然。 這將使您能夠保持應用程序的一致性和可讀性,從而使應用程序易於開發。

在有管理員和用戶帳戶的應用程序中,我建議使用Middleware +(( roles + permissions )),不要在路由/user//admin/應用通用/user/

在我描述的示例中,您可以在PostController使用一種方法,例如: show ,add權限(例如user-post-listadmin ),add角色(例如adminuser ),在路由中描述誰擁有權限(例如user-post-listadmin )分配給給定的功能(顯示)並分配:角色權限,用戶角色-用戶一個或多個角色。 您也可以在路由中添加角色,並在控制器中分配適當的權限。 您可以使用從文件加載權限fixtures ,例如permissions.csvroles.csvrole_permission.csv或用seedsfixtures或僅seeds -前使創建角色和權限-創建適當的遷移)

第二種解決方案(並且僅使用Seed)並不靈活,因為與第一種解決方案相比,擴大權限和角色列表涉及修改代碼-從文件中加載它們。

當然,還有其他解決方案。 我認為我的提議有一個簡單的邏輯,它是有效且靈活的變更。

檢查此內容: https : //itsolutionstuff.com/post/laravel-56-user-roles-and-permissions-acl-using-spatie-tutorialexample.html

要么

https://www.google.pl/search?q=laravel+roles+and+permissions+tutorial&oq=laravel+roles+&aqs=chrome.4.69i57j69i60j69i65j0l3.11595j0j7&sourceid=chrome&ie=UTF-8

當用戶具有不同的訪問類型時,這是我在Laravel中解決此問題的方法。

可以說我們有一個像您這樣的模型,稱為Post。 現在我們要做的是,向該模型添加一個范圍,我們將在這里進一步定義以下范圍:

use App\Scopes\AdminScope;
class Post extends Model {

// Apply a global scope to this controller
    protected static function boot(){
        parent::boot();
        static::addGlobalScope(new AdminScope);
    }

在路由器中,將其定義為常規資源路由:

Route::resource('posts', 'PostsController');

在Controller中,您可以像平常一樣在index方法上獲取所有帖子。 這將在我們創建管理范圍后,為管理員用戶返回系統中的所有帖子,對於常規用戶返回屬於特定用戶的帖子:

class PostsController extends Controller {

public function index(){
    $posts = Post::all();
}

根據登錄的用戶類型,不區分返回系統中的所有帖子或僅返回屬於當前用戶的帖子的部分:

在應用程序文件夾中創建一個名為Scopes的新文件夾。 在此文件夾中,創建一個名為AdminScope.php的新文件,該文件如下所示:

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Auth;
class AdminScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        // IF THE CURRENT USER TYPE IS NOT ADMIN, ALTER THE QUERIES:
        if( Auth::user()->type != "admin" ){
            $builder->where('user_id', '=', Auth::user()->id)
        }
    }
}

當然,您將需要更改最后一個文件,以滿足區分普通用戶和管理員的要求。

這種方法的好處是,您現在可以將此合並范圍應用於您認為合適的任何模型,並且它將更改非管理員用戶的所有查詢,以僅顯示他們擁有應用該范圍的模型。

注意:

這是一個全局范圍,將應用於添加了它的所有Eloquent模型以及對該模型進行的所有查詢。 如果需要,還可以編寫條件局部范圍,您可以在此處了解更多信息:

本地范圍

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM