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

时间:2014-10-02 20:34:23

标签: php laravel laravel-4 closures laravel-routing

因此,我尝试使用Laravel的自定义过滤器对用户进行身份验证。我有我的LDAP PHP脚本工作,我基本上已将其插入我的自定义过滤器。但是,我需要将此脚本传递给用户在登录屏幕上输入的用户名和密码;换句话说,我需要从登录表单中传递我的自定义过滤器这个用户名和密码。

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

routes.php文件

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

filters.php

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(),但我不知道如何使用它来传递我的用户名和密码。输入:: get()。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

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

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

在你的Closure中,第三个参数会收到你传入的参数,它是$param,所以你可以在之前的过滤器中传递它:

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

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

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

如果您愿意,也可以使用Input::get('username')代替$request但是它会使用$request实例变量,我希望使用它。

答案 1 :(得分:0)

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

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' ......

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