如何防止Laravel控制器方法处理没有预期参数列表的HTTP请求?

时间:2017-03-20 10:15:47

标签: php laravel laravel-5 laravel-routing laravel-5.4

我是PHP的新手,而且还是 Laravel 。我来自Java,我是一名Spring MVC开发人员。现在我正在使用 Laravel 5.4 进行项目。

我怀疑是否有可能创建Laravel控制器方法来处理具有特定参数列表的HTTP请求(作为控制器方法输入参数)。

在Spring MVC中我可以声明控制器方法只接受具有特定列表的请求(并且在PHP中我们没有键入类型)而不是简单的 Request $ request 对象的提取参数。

我认为能够声明pameters列表(输入 Request 对象然后从中提取)要好得多,因为代码更具可读性(您阅读方法签名并知道它是什么如果用户没有指定所有的neede参数,那么应用程序无法进入控制器方法!

例如,我有这样的请求(表示在用户注册后通过电子邮件在我的Laravel网站上激活帐户的链接):

http://laravel.dev/activate?email=my-email@gmail.com&token=cce0452d95c358b5b3b97fec5662e12e

我不会像这样的控制器方法:

public function activate(Request $request) {
    if ( $request->has('email') && $request->has('token')) {
        $email = $request->email;
        $token = $request->token;
    }
}

,因为:

  • 查看输入参数我只有请求$ request 对象,该对象没有说明此方法将使用的内容。

  • 最重要的是,我必须手动处理电子邮件令牌请求参数的提取,并检查请求中是否存在这些参数。

我想要的是,如果HTTP请求不包含预期参数列表,则该方法将不会处理此请求。

我创立了这个解决方案:

在我的 web.php 文件中,我放了这条路线:

Route::get('/activate', [ 'as' => 'activate', function() {
    return app()->make(App\Http\Controllers\RegistrationController::class)->callAction('activate', $parameters = [ 'email' => request()->email, 'token' => request()->token ]);
}]);

然后这是我的 RegistrationController 类的控制器方法:

public function activate($email, $token) {

    echo "Email: $email"; // myemail@gmail.com
    echo "Token: $token"; // eb0d89ba7a277621d7f1adf4c7803ebc
    // do stuff
}

问题在于,这样做我可以将请求参数指定为我的控制器方法的输入参数(使其更具可读性)但主要问题仍然存在,实际上我可以像这样执行HTTP请求:

http://laravel.dev/activate?email=nobili.andrea@gmail.com&XDEBUG_SESSION_START=14267

activate()控制器方法处理。

我真的希望阻止此方法处理没有预期请求参数的请求。

我能以某种方式在Laravel中完成吗?也许我可以修改此解决方案以获得此行为吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以验证请求,但它可能与Spring MCV有点不同。

您可以将方法中的Request $request替换为使用表单请求验证检查参数的方法:

有关所有信息,请参阅docs,但要点是:

php artisan make:request ActivateRequest

这使App/Http/Requests中的ActivateRequest文件具有规则:

public function rules()
{
    return [
        'email' => 'required|email',
        'token' => 'required',
    ];
}

然后在你的控制器中:

public function activate(ActivateRequest $request) {
    return 'Works!';
}

如果有两种方式,它会自动返回错误:

  1. 在正常请求中,它redirect()->back()并提供$errors数组,您可以在代码中访问该数组。

  2. 在JSON或API请求中,它显示包含所有错误的JSON数组。