Php 拉威尔滤波器

Php 拉威尔滤波器,php,laravel,Php,Laravel,我正在使用Laravel 4.1构建一个应用程序。我的应用程序需要有两种不同类型的用户,管理员和客户端。为了实现这一点,我在user表中添加了一个type列,并在/app/filters.php中创建了customs过滤器 Route::filter('admin', function() { if (Auth::guest() || Auth::user()->type !== 1) return Redirect::to('/'); }); Route::filter('cl

我正在使用Laravel 4.1构建一个应用程序。我的应用程序需要有两种不同类型的用户,管理员和客户端。为了实现这一点,我在user表中添加了一个type列,并在/app/filters.php中创建了customs过滤器

Route::filter('admin', function()
{
    if (Auth::guest() || Auth::user()->type !== 1) return Redirect::to('/');
});

Route::filter('client', function()
{
    if (Auth::guest() || Auth::user()->type != 2) return Redirect::to('/');
});
然后我在/app/routes.php中创建了Route::group

/* Admin */
Route::group(array('before' => 'admin'), function()
{
    Route::get('admin', function(){ return "admin index"; });
    Route::get('ejemplo', function(){ return "admin ejmplo"; });
});

/* Client */
Route::group(array('before' => 'client'), function()
{
    Route::get('client', function(){ return "client index"; });
    Route::get('ejemplo', function(){ return "client ejmplo"; });
});
我面临的问题是,我无法访问Route::get('Ejempo'),我想了一个解决方案:

  • 在路由组中添加if语句,以便只有Auth::user()->type([x])可以访问某些路由
但因为我对拉威尔来说是个新手,所以我不想把我的代码弄乱,使其无法扩展或维护

我愿意接受任何其他解决方案或结构设计

事先非常感谢。
欢呼声

不会重新定义同名路线。路由设计为指向一个位置,筛选器设计为筛选对路由的访问,拒绝不符合条件的客户端(未授权、错误的csrf令牌、权限不足等)

我会问你自己,你是否真的需要你的示例路线根据用户输入指向两个不同的地方,根据我到目前为止的经验,答案可能是否定的

你考虑过类似的事情吗

Route::group( array( 'prefix' => 'admin', 'before' => 'admin' ) function() {
    Route::get( 'admin',   function() { return "admin index";    } );
    Route::get( 'example', function() { return "admin example";  } );
});

Route::group( array( 'prefix' => 'client', 'before' => 'client' ), function() {
    Route::get( 'client',  function() { return "client index";   } );
    Route::get( 'example', function() { return "client example"; } );
});
然后你就可以通过

example.co.uk/admin/example
example.co.uk/client/example
如果这对你不起作用,你真的需要路线指向不同的地方,我会考虑的两个选择是

  • 使用你在第一篇文章中建议的if语句
  • 在控制器中处理它
  • 控制器示例:

    function MyControllerFunction() {
        $user = Auth::user();
        if ( is_null( $user ) ) {
            HandleUserNotAuthed();
        }
        if( Auth::user()->isAdmin ) {
            HandleAdminCodeHere();
        } else {
            HandleClientCodeHere();
        }
    }
    
    路线示例:

    $user = Auth::user();
    if( ! ( is_null( $user ) ) ) {
        if( $user->isAdmin ) {
            Route::get( 'admin',   function() { return "admin index";    } );
            Route::get( 'example', function() { return "admin example";  } );
        } else {
            Route::get( 'client',  function() { return "client index";   } );
            Route::get( 'example', function() { return "client example"; } );
        }
    }
    

    正如你所知道的,最后两个例子非常混乱,我不推荐它,除非你必须有相同的URL。查看您的应用程序,找出是否可以使用不同的路由,如果可以,请这样做(:

    Laravel saves是以url作为唯一索引的路由。这意味着除非您使用
    if/else
    ,否则不能有两个具有相同url的路由

    我建议您创建另一个过滤器,检查用户是管理员还是客户端,然后将共享
    路由添加到新组中

    过滤器

    Route::filter('admin', function()
    {
        if (Auth::guest() || Auth::user()->type !== 1) return Redirect::to('/');
    });
    
    Route::filter('client', function()
    {
        if (Auth::guest() || Auth::user()->type != 2) return Redirect::to('/');
    });
    
    Route::filter('admin_or_client', function()
    {
        if (Auth::guest() || ! in_array(Auth::user()->type, [1, 2])) return Redirect::to('/');
    });
    
    /* Admin */
    Route::group(array('before' => 'admin'), function()
    {
        Route::get('admin', function(){ return "admin index"; });
    });
    
    /* Client */
    Route::group(array('before' => 'client'), function()
    {
        Route::get('client', function(){ return "client index"; })
    });
    
    /* Admin or Client */
    Route::group(array('before' => 'admin_or_client'), function()
    {
        Route::get('ejemplo', function(){ return "admin or client ejmplo"; });
    });
    
    路线

    Route::filter('admin', function()
    {
        if (Auth::guest() || Auth::user()->type !== 1) return Redirect::to('/');
    });
    
    Route::filter('client', function()
    {
        if (Auth::guest() || Auth::user()->type != 2) return Redirect::to('/');
    });
    
    Route::filter('admin_or_client', function()
    {
        if (Auth::guest() || ! in_array(Auth::user()->type, [1, 2])) return Redirect::to('/');
    });
    
    /* Admin */
    Route::group(array('before' => 'admin'), function()
    {
        Route::get('admin', function(){ return "admin index"; });
    });
    
    /* Client */
    Route::group(array('before' => 'client'), function()
    {
        Route::get('client', function(){ return "client index"; })
    });
    
    /* Admin or Client */
    Route::group(array('before' => 'admin_or_client'), function()
    {
        Route::get('ejemplo', function(){ return "admin or client ejmplo"; });
    });
    

    这就是过滤器的用途…检查它们是否正常工作(例如,
    type
    真的是int
    1
    )是的,它是int,当路由::get('url')时,过滤器工作得很好重复,我正在尝试命名路由,看看我是否能让它工作。问题是,你不能作为
    客户端访问
    ejempo
    ?我不能作为管理员访问ejempo,但我可以作为客户端访问ejempo。你是对的,我将使用prefix,从长远来看,这似乎是一个更好的解决方案!干杯!