【问题标题】:Laravel routing, filter loopsLaravel 路由,过滤循环
【发布时间】:2013-09-23 05:51:03
【问题描述】:

重写了我的路由和过滤器脚本并且它工作了,所以第一次可能犯了一个愚蠢的错误。发布了代码的缩小版本(删除了大部分路线)作为下面的答案。也接受了第一个答案,因此问题得到了回答。

从发现 laravel 的奇迹开始,但现在我被困住了。

我做了什么

  • 首先我创建了几条路线。

    这行得通。

  • 然后我为一个溃败组创建了一个过滤器。

    当我将路由组放在我的默认路由后面时,这有点工作。但是我可以解决这个问题,因为代码是从顶部执行的,并且当我将它放在我的默认路由之前的默认路由之前会被重写。听起来很合乎逻辑。

  • 多个组的。

    这是没有严重错误的地方。我首先创建了两个过滤器,因为我不知道是否可以制作负过滤器或以这种方式制作的东西。

    一个过滤器与另一个过滤器完全相反。因此,如果过滤器一中的条件为真,则过滤器二中的条件为假。这样做是希望实现一个 rout 仅在该 rout 条件满足时执行,而另一个 rout 仅在不满足时执行。这导致了一个循环,我不明白。

我想要完成的事情

我希望一组页面可以访问,但第二组不能访问,反之亦然。 如果用户来自第一组,但请求第二组的页面,他会被重定向到第一组的“/”路由。

我的尝试导致了重定向疯狂的不定式循环

一个例子

假设 John Doe 向 url 发出 get 请求。他降落在'/'路线上。 John 未登录(或不满足任何条件)。所以 John 属于未登录的第一组人。John 被重定向到登录页面。

John 现在可以登录并登录。现在 John 属于第二组,该组由已登录的人组成。他现在一定无法看到登录页面。因此,当第 2 组的人向用于第 1 组的页面(例如 /login)发出请求时,他或她必须被重定向到用于第 2 组的页面(例如“/”)。

$a = true;
if($a){
  Route::get('/', function(){return Redirect::to('login');});
  Route::get('login', function(){View::make();});
}else{
  Route::get('login', function(){return Redirect::to('/');});
  Route::get('/', function(){View::make();});
}

问题:我如何使用 laravel 路由来做到这一点?

【问题讨论】:

  • 你能发布你现有的路由配置吗? (正如你所说,导致无限重定向循环)
  • 我可以,但它与执行其逻辑的控制器功能相关联。但是我会尝试下面的答案,如果这不起作用,我会输入它。
  • 可能犯了一个愚蠢的错误,在大多数代码行中从头开始添加,现在它可以工作了。将在下面发布新代码。谢谢你的努力。 +1

标签: php routing laravel laravel-4


【解决方案1】:

可能是我犯了一个愚蠢的错误,重写了代码,现在它可以工作了:

过滤器:

Route::filter('access', function() {
    if (Config::get('app.lockapp') && empty(Session::get('test_access'))) {
        return Redirect::to('getaccess');
    }
});

Route::filter('lock', function() {
    if (!Config::get('app.lockapp') || !empty(Session::get('test_access'))) {
        return Redirect::to('/');
    }
});

路线:

//test enviorment
Route::group(array('before' => 'lock'), function() {

    Route::get('/', 
        'TestController@redirect_test'
    );

    Route::get('test',
        'TestController@show_authentication'
    );

});

//application
Route::group(array('before' => 'access'), function() {

    Route::get('/', 
        'AppController@show_app'
    );

});

【讨论】:

    【解决方案2】:

    这里A组没有被授权,B组被授权。所以你可以检查登录状态。例如。

    Route::get('login', function()
    {
        if(Auth::user()) {
            return Redirect::to('admin');
        }
    
        return View::make('login');
    });
    

    您可以在所有A组页面中使用Auth::user()来过滤用户。

    【讨论】:

    • Mhhh... 我会尝试一下,但已经使用 Auth 类对我的用户进行身份验证。因此我使用了第一组和第二组。我想在网上发布一个测试版本,但不想让全世界都访问它,因为它还没有按预期工作。因此进行了额外的身份验证,它只设置了一个会话变量测试。因此,当我访问在线版本时,它显示“正在建设中”,并带有一个身份验证窗口来查看该站点。
    • 可能犯了一个愚蠢的错误,在大多数代码行中从头开始添加,现在它可以工作了。将在下面发布新代码。谢谢你的努力。 +1
    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多