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

时间:2018-06-21 14:46:59

标签: php laravel-5

假设,我有一个模型“ Post”,并为其创建了两个资源控制器-User / PostController和Admin / PostController。

因此,当我希望消耗资源时,我的路线将如下所示:

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

按照惯例,这是正确的还是我做错了?

3 个答案:

答案 0 :(得分:0)

建议为其控制器使用单独的模型,反之亦然。这将使您能够保持应用程序的一致性和可读性,使应用程序易于开发。

在有管理员和用户帐户的应用程序中,建议使用Middleware +(roles + permissions),不要在路由/user/和{ {1}}适用的一般/admin/

答案 1 :(得分:0)

在我描述的示例中,您可以在PostController中使用一种方法,例如:show,添加权限(例如user-post-listadmin),添加角色(例如adminuser)中的角色,描述谁拥有给定功能(显示)的权限(例如user-post-listadmin),并分配:角色的权限,用户角色-用户的一个或多个角色。您也可以在路由中添加角色,并在控制器中分配适当的权限。 您可以使用fixtures,例如permissions.csvroles.csvrole_permission.csv从文件加载权限,也可以使用seedsfixtures或仅使用{{ 1}}-在创建角色和权限之前  -创建适当的迁移)

第二个解决方案(并且仅使用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

答案 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模型以及对该模型进行的所有查询。如果需要,还可以编写条件局部范围,您可以在此处了解更多信息:

Local Scopes