[英]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-list
, admin
),add角色(例如admin
, user
),在路由中描述誰擁有權限(例如user-post-list
, admin
)分配給給定的功能(顯示)並分配:角色權限,用戶角色-用戶一個或多個角色。 您也可以在路由中添加角色,並在控制器中分配適當的權限。 您可以使用從文件加載權限fixtures
,例如permissions.csv
, roles.csv
, role_permission.csv
或用seeds
和fixtures
或僅seeds
-前使創建角色和權限-創建適當的遷移)
第二種解決方案(並且僅使用Seed)並不靈活,因為與第一種解決方案相比,擴大權限和角色列表涉及修改代碼-從文件中加載它們。
當然,還有其他解決方案。 我認為我的提議有一個簡單的邏輯,它是有效且靈活的變更。
檢查此內容: https : //itsolutionstuff.com/post/laravel-56-user-roles-and-permissions-acl-using-spatie-tutorialexample.html
要么
當用戶具有不同的訪問類型時,這是我在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.