Php 拉威尔自定义过滤器

Php 拉威尔自定义过滤器,php,laravel,laravel-4,routes,Php,Laravel,Laravel 4,Routes,我需要能够访问一些路线,只有当一个条件得到满足。否则我就不能进入那些路线了 我认为这应该用一个过滤器来完成,但我想我遗漏了一些关于它们是如何工作的 这是我的过滤器: Route::filter('my.filter', function() { //some code regarding said condition if($mycondition==true){ //WHAT TO PUT HERE? }else{ //Error mes

我需要能够访问一些路线,只有当一个条件得到满足。否则我就不能进入那些路线了

我认为这应该用一个过滤器来完成,但我想我遗漏了一些关于它们是如何工作的

这是我的过滤器:

Route::filter('my.filter', function()
{
    //some code regarding said condition
    if($mycondition==true){
        //WHAT TO PUT HERE?
    }else{
        //Error message
    }
}
在我的路线上,我将有:

Route::group(array('before' => 'my.filter'), function()
{
    Route::resource('cities', 'CitiesController');
    //... many more controllers here
});

但是我看到的所有示例在if部分的过滤器内部都有一个重定向。我不希望这样,我只希望,如果过滤器中的条件为真,您可以看到该url。

您不必在那里放置任何内容,只需让函数返回void即可。这将告诉laravel允许用户查看该页面。您可以自己在那里放置一个
return
,让用户看到页面并跳过以下所有条件

当条件不满足时,最好将用户重定向到一个页面,在该页面上解释用户无法看到该页面的原因

Route::filter('my.filter', function()
{
    //some code regarding said condition
    if($mycondition==true){
        return;
    }else{
        //Error message
    }
}

如果您想让过滤器停止进一步执行路由(和控制器等),您必须:

  • 返回某物(例如重定向)
  • 或者抛出异常
在Laravel中,您可以非常轻松地执行此操作:

Route::filter('my.filter', function()
{
    //some code regarding said condition
    if($mycondition==true){
        // here you have to do nothing so you could also flip the if...
    }else{
        App::abort(403);
    }
}

小旁注:正如上面在评论中提到的,我将翻转if。就像这样:

Route::filter('my.filter', function()
{
    //some code regarding said condition
    if($mycondition==false){
        App::abort(403);
    }
}

问题是,如果条件为假,您希望用户看到什么?一种可能是抛出HTTP 403错误(访问被拒绝)…是的,我没问题,但是,怎么做?等一下,我要写一个答案你应该返回
true
如果你的过滤器Jonathon中满足条件,无论我在过滤器中返回什么,都会在浏览器上输出,我不希望这样。我想要路由页面。您是否用真实条件替换了
$condition
?嗯,我的问题似乎在我正在测试的控制器的其他地方,看起来您的解决方案适用于过滤部分,只需要解决其他问题。不,此解决方案与您预期的不一样。从过滤器返回就像从路线返回某些内容。因此,要“让请求通过”,您不需要返回任何内容。如果要阻止它,请返回某些内容或抛出异常。(参见我的答案)嗯,我得到的响应内容必须是一个实现_toString(),给定“boolean”的字符串或对象。当我使用一个更简单的控制器进行测试时,您就在这里,但中止不起作用,返回Response::make('Unauthorized',401);在我的情况下,我成功了。回归真是把事情搞砸了。