具有多个参数的基本Laravel路由过滤


Basic Laravel route filtering with multiple parameters

所以我试图使用Laravel的自定义过滤器来验证我的用户。我有我的LDAP PHP脚本工作,我基本上已经把它插入到我的自定义过滤器中。然而,我需要将用户在登录屏幕上输入的用户名和密码传递给这个脚本;换句话说,我需要从登录表单中通过我的自定义过滤器这个用户名和密码。

这是我的代码来帮助解释我的问题:

routes.php

Route::group(array('before' => 'ldapTest'), function() {
    Route::controller('apps', 'AppController', array(
        //named routes here
    ));
});

过滤器.pp

Route::filter('ldapTest', function()
{
    $username = //how do I get this?
    $password = //how do I get this?
    //LDAP logic goes here; assume $ldapConn and $userDN are properly initialized
    $userBind = @ldap_bind($ldapConn, $userDN, $password);
    if($userBind)
    {
        Auth::login(//what goes here?  I want to access $username later on in applications);
        return Redirect::to('apps/home');
    }
    else
    {
        echo 'Incorrect password';
    }
});

通过阅读文档,我知道您可以将参数作为字符串传递给过滤器,比如:Route::filter('ldapTest:400', function(),但我不明白如何使用它来传递我的用户名和密码,我认为它是Input::get()。

我该怎么做?

实际上,您可以将参数传递到自定义过滤器中,在这种情况下,您的过滤器应该如下所示:

Route::filter('ldapTest', function($route, $request, $param){
    //...
});

在您的Closure中,第三个参数将接收您传入的参数,它是$param,因此您可以在前过滤器中这样传递它:

array('before' => 'ldapTest:someString')

因此,在过滤器中,$param将包含someString,但在您的情况下,我认为这会有点不同,因为您希望接收通过表单提交的用户输入,因此为了获得这些输入,您可以在过滤器的处理程序(闭包)中使用类似的东西:

$username = $request->get('username'); // Assumed that username is a form field
$password = $request->get('password');

此外,如果您愿意,您可以使用Input::get('username')而不是$request,但它将与$request实例变量一起使用,我更喜欢使用它。

我的项目中也有类似的需求,用这个(不是很优雅,但很有效)解决方法:

Route::filter('multiParamFilter', function($route, $request, $params){
     list($p1, $p2) = explode(':', $params);
     //Now you have $p1 and $p2 initialized with parameters
     ....
}

在routes.php中,您可以调用:

Route::get('path', array('before' => 'multiParamFilter:p1:p2' ......

注意:它要求您不要在参数值中使用":"(或至少另一个符号)