如何防止 Laravel 控制器方法处理没有预期参数列表的 HTTP 请求?
How can I prevent that a Laravel controller method handle HTTP Request that doesn't have the expected parameters list?
我在 PHP 和 Laravel 都是新手。我来自 Java,我是一名 Spring MVC 开发人员。现在我正在为一个项目使用Laravel 5.4。
我对创建 Laravel 控制器方法的可能性有以下疑问,该方法处理具有特定参数列表的 HTTP 请求(作为控制器方法输入参数)。
在 Spring MVC 中,我可以声明控制器方法,该方法只接受具有特定列表(和类型,但在 PHP 中我们没有类型)参数的请求,而不是简单的 Request $request 对象,从中提取参数。
我认为能够声明参数列表(安装 Request 对象然后从中提取)要好得多,因为代码更具可读性(您阅读了方法签名并且您知道它的用途)以及 如果用户未指定所有需要的参数,应用程序将无法进入控制器方法!!!
例如我有一个这样的请求(代表 link 在我的 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 对象,没有说明此方法将使用什么。
最重要的是我必须手动处理 email 和 token 请求参数的提取并检查如果请求中存在这些参数。
我想要的是,如果 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 class:
控制器方法
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 中以某种方式完成吗?也许我可以修改此解决方案以获得此行为吗?
是的,您可以验证请求,但它可能与 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!';
}
如果有两种错误,它会自动return错误:
在正常请求中,它会执行 redirect()->back()
并提供一个 $errors
数组,您可以在代码中访问该数组。
在 JSON 或 API 请求中它显示一个包含所有错误的 JSON 数组。
我在 PHP 和 Laravel 都是新手。我来自 Java,我是一名 Spring MVC 开发人员。现在我正在为一个项目使用Laravel 5.4。
我对创建 Laravel 控制器方法的可能性有以下疑问,该方法处理具有特定参数列表的 HTTP 请求(作为控制器方法输入参数)。
在 Spring MVC 中,我可以声明控制器方法,该方法只接受具有特定列表(和类型,但在 PHP 中我们没有类型)参数的请求,而不是简单的 Request $request 对象,从中提取参数。
我认为能够声明参数列表(安装 Request 对象然后从中提取)要好得多,因为代码更具可读性(您阅读了方法签名并且您知道它的用途)以及 如果用户未指定所有需要的参数,应用程序将无法进入控制器方法!!!
例如我有一个这样的请求(代表 link 在我的 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 对象,没有说明此方法将使用什么。
最重要的是我必须手动处理 email 和 token 请求参数的提取并检查如果请求中存在这些参数。
我想要的是,如果 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 class:
控制器方法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 中以某种方式完成吗?也许我可以修改此解决方案以获得此行为吗?
是的,您可以验证请求,但它可能与 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!';
}
如果有两种错误,它会自动return错误:
在正常请求中,它会执行
redirect()->back()
并提供一个$errors
数组,您可以在代码中访问该数组。在 JSON 或 API 请求中它显示一个包含所有错误的 JSON 数组。