Laravel过滤器路线

时间:2014-05-28 09:07:22

标签: php laravel

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

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('ejemplo'),我想到了解决方案:

  • 在路由组中添加if语句,因此只有Auth :: user() - > type([x])才能访问某些路由。

但是因为我对laravel很陌生,所以我不想弄乱我的代码,使其无法扩展或不可维护。

我对任何其他解决方案或结构设计持开放态度,

非常感谢您提前。 干杯

2 个答案:

答案 0 :(得分:0)

请勿重新定义具有相同名称的路线。路由设计为指向一个位置,过滤器旨在过滤对路由的访问,拒绝不符合条件的客户端(不是authed,错误的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

如果这对您不起作用,并且您确实需要指向不同位置的路线,那么我要考虑的两个选项是

  1. 使用您在第一篇文章中建议的if语句
  2. 在您的控制器中处理
  3. 控制器示例:

    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,否则我不会推荐它。查看您的应用程序并确定您是否可以使用不同的路由,如果可以,请执行此操作(:

答案 1 :(得分:0)

Laravel save是将url作为唯一索引的路由。这意味着除非您使用if/else,否则您不能拥有两条具有相同网址的路由。

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

过滤器

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"; });
});