首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Laravel 4中根据用户类型制作路由过滤器?

如何在Laravel 4中根据用户类型制作路由过滤器?
EN

Stack Overflow用户
提问于 2014-11-27 14:43:04
回答 2查看 545关注 0票数 0

目标:我想使用Route::groupRoute::filter在Laravel 4中制作路径过滤器

描述

我有两个类型的用户:

  1. 内部
  2. 分配器

对于Internal,我有两个组:

  • 管理员
  • 规则性

对于Distributor,我有4个组:

  • 黄金
  • 银牌
  • 青铜器
  • oem

合格线路

OEM分销商只符合5条路线的条件。

代码语言:javascript
运行
复制
Route::get('distributors/{id}', array('before' =>'profile', 'uses'=>'DistributorController@show'));
Route::get('distributors/{id}/edit', 'DistributorController@edit');
Route::put('distributors/{id}/update', array('as'=>'distributors.update', 'uses'=>'DistributorController@update'));
Route::get('catalog_downloads','CatalogDownloadController@index');
Route::get('catalog_downloads/{id}/download','CatalogDownloadController@file_download');

正规分销商有资格选择8条路线。

代码语言:javascript
运行
复制
Route::get('distributors/{id}', array('before' =>'profile', 'uses'=>'DistributorController@show'));
Route::get('distributors/{id}/edit', 'DistributorController@edit');
Route::put('distributors/{id}/update', array('as'=>'distributors.update', 'uses'=>'DistributorController@update'));
Route::get('catalog_downloads','CatalogDownloadController@index');
Route::get('catalog_downloads/{id}/download','CatalogDownloadController@file_download');
Route::get('marketing_materials','MarketingMaterialController@index');
Route::get('marketing_materials/{id}/download/thumb_path','MarketingMaterialController@thumb_download');
Route::get('marketing_materials/{id}/download/media_path','MarketingMaterialController@media_download');

问题

  • 有人能帮我吗,或者至少带我到的右方向
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-02 18:06:54

首先:不可能声明导致相同的两次的路由。不管是集体的还是非团体的。(如果您有一个带有prefix的组,则有可能因为前缀更改到路由的URL )

您必须通过智能过滤来解决这个问题。

这是我想出的最简单的解决方案:

代码语言:javascript
运行
复制
Route::filter('distributor', function(){
    $user = Auth::user();
    if($user->type == "Distributor"){
        return true;
    }
    if (Request::ajax()){
        return Response::make('Unauthorized', 404);
    }
    return View::make('errors.404_auth');
});

Route::filter('distributor.regular', function(){
    $user = Auth::user();
    if($user->type == "Distributor"){
        if($user->distributor()->type != 'OEM'){
            return true;
        }
    }
    if (Request::ajax()){
        return Response::make('Unauthorized', 404);
    }
    return View::make('errors.404_auth');
});

distributor过滤器只检查用户是否属于Distributor类型。第二个过滤器,distributor.regular,检查分销商是否不是OEM。(如果您想知道,distributor.regular中的点没有特殊的功能或更深层次的含义。我只是喜欢这样写)

代码语言:javascript
运行
复制
Route::group(['before' => 'distributor'], function(){
    Route::get('distributors/{id}', array('before' =>'profile', 'uses'=>'DistributorController@show'));
    Route::get('distributors/{id}/edit', 'DistributorController@edit');
    Route::put('distributors/{id}/update', array('as'=>'distributors.update', 'uses'=>'DistributorController@update'));
    Route::get('catalog_downloads','CatalogDownloadController@index');
    Route::get('catalog_downloads/{id}/download','CatalogDownloadController@file_download');

    Route::group(['before' => 'distributor.regular'], function(){
        Route::get('catalog_downloads', 'CatalogDownloadController@index');
        Route::get('catalog_downloads/{id}/download', 'CatalogDownloadController@file_download');
        Route::get('marketing_materials', 'MarketingMaterialController@index');
        Route::get('marketing_materials/{id}/download/thumb_path', 'MarketingMaterialController@thumb_download');
        Route::get('marketing_materials/{id}/download/media_path', 'MarketingMaterialController@media_download');
    });
});

这应该已经适用于您发布的用例。然而,我们可以使过滤器更加灵活,也可以减少冗余代码。

代码语言:javascript
运行
复制
function makeError404(){
    if (Request::ajax()){
        return Response::make('Unauthorized', 404);
    }
    return View::make('errors.404_auth');
}

Route::filter('distributor', function(){
    $user = Auth::user();
    if($user->type == "Distributor"){
        return true;
    }
    return makeError404();
});

Route::filter('distributor.group', function($route, $request, $value){
    $groups = explode(';', $value);
    $user = Auth::user();
    if($user->type == "Distributor"){
        if(in_array($user->distributor()->type, $groups)){
            return true;
        }
    }
    return makeError404();
});

现在我们可以动态地指定用户必须在哪个组中.

代码语言:javascript
运行
复制
Route::group(['before' => 'distributor'], function(){
    // distributor routes

    Route::group(['before' => 'distributor.group:gold;silver;bronze'], function(){
        // regular routes
    });
});
票数 1
EN

Stack Overflow用户

发布于 2014-11-27 14:56:46

你可以走这样一条路

代码语言:javascript
运行
复制
class UserController extends BaseController {

    /**
     * Instantiate a new UserController instance.
     */
    public function __construct()
    {
        $this->beforeFilter('employee', array('only' => 'index'));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27173234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档