【问题标题】:How can I prevent that a Laravel controller method handle HTTP Request that doesn't have the expected parameters list?如何防止 Laravel 控制器方法处理没有预期参数列表的 HTTP 请求?
【发布时间】:2017-08-11 13:46:06
【问题描述】:

我对 PHP 和 Laravel 还是很陌生。我来自 Java,是一名 Spring MVC 开发人员。现在我在一个项目中使用 Laravel 5.4

我对创建处理具有特定参数列表(作为控制器方法输入参数)的 HTTP 请求的 Laravel 控制器方法的可能性有以下疑问。

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

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

例如我有一个这样的请求(代表在用户注册后通过电子邮件发送的用于激活我的 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 $request 对象,它没有说明此方法将使用什么。

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

我希望的是,如果 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 中以某种方式做到这一点吗?也许我可以修改这个解决方案来获得这种行为?

【问题讨论】:

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


【解决方案1】:

是的,您可以验证请求,但它的工作方式可能与 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 数组。

【讨论】:

  • 好的,解决了。如果我仍然更喜欢 Spring 方式,我认为这也是一个很好的解决方案,因为对我来说,验证是不同的东西,它检查 HTTP 请求参数的数量和类型(验证更多的是与表单字段的语义内容相关)。但它有效,而且非常整洁......所以......好吧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2018-06-05
  • 2019-08-29
  • 2017-06-25
  • 2019-03-17
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多