假设,我有一个模型“ Post”,并为其创建了两个资源控制器-User / PostController和Admin / PostController。
因此,当我希望消耗资源时,我的路线将如下所示:
/user/post/:id
/admin/post/:id
按照惯例,这是正确的还是我做错了?
答案 0 :(得分:0)
建议为其控制器使用单独的模型,反之亦然。这将使您能够保持应用程序的一致性和可读性,使应用程序易于开发。
在有管理员和用户帐户的应用程序中,建议使用Middleware
+(roles
+ permissions
),不要在路由/user/
和{ {1}}适用的一般/admin/
答案 1 :(得分:0)
在我描述的示例中,您可以在PostController
中使用一种方法,例如:show
,添加权限(例如user-post-list
,admin
),添加角色(例如admin
,user
)中的角色,描述谁拥有给定功能(显示)的权限(例如user-post-list
,admin
),并分配:角色的权限,用户角色-用户的一个或多个角色。您也可以在路由中添加角色,并在控制器中分配适当的权限。
您可以使用fixtures
,例如permissions.csv
,roles.csv
,role_permission.csv
从文件加载权限,也可以使用seeds
和fixtures
或仅使用{{ 1}}-在创建角色和权限之前
-创建适当的迁移)
第二个解决方案(并且仅使用Seed)不灵活,因为与第一个解决方案相比,扩大权限和角色列表涉及修改代码-从文件中加载它们。
当然,还有其他解决方案。我认为我的提议有一个简单的逻辑,它是有效且灵活的变更。
或
答案 2 :(得分:0)
当用户具有不同的访问类型时,这就是我在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)
}
}
}
当然,您需要更改最后一个文件,以满足区分普通用户和管理员的要求。
此方法的优点是,您现在可以将此Scope应用于您认为合适的任何模型,并且它将更改非管理员用户的所有查询,仅显示他们拥有该范围的模型被应用。
注意:
这是一个全局范围,将应用于添加了它的所有Eloquent模型以及对该模型进行的所有查询。如果需要,还可以编写条件局部范围,您可以在此处了解更多信息: