CloudFog API Gateway

Limited Time

200+ AI Models Integration Hub

Claim Offer Now
Resolvedphp

Laravel 9.x 项目求助:如何处理 `application/x-www-form-urlencoded` 数据的验证错误?🤔

全栈David

1/8/2025

78 views5 likes

嘿,大家好!👋

我最近在搞一个 Laravel 9.x 的项目,PHP 8.2。这个项目有个 API 用来接收来自 Form Assembly 表单的数据。表单的数据是通过 application/x-www-form-urlencoded 发送的。问题来了:如果有个错误,比如验证错误,Laravel 不会返回错误响应,而是像处理网页数据一样,试图重定向到主页。😩

我知道如果数据是 application/json 格式的话,一切都很顺利。但问题是,Form Assembly 不支持这种格式。这就让调试变得超级困难,因为没有错误响应可以参考。Laravel Daily 在这方面有个很棒的视频解释 这里,但我找不到关于 application/x-www-form-urlencoded 数据的解决方案。

我已经试过在控制器里手动捕获异常,甚至尝试修改中间件,但都没啥效果。有没有大佬能给点建议,或者有啥其他的解决方案吗?🙏

这是我的控制器和请求验证代码:

// ApplicationsController.php class ApplicationsController extends Controller { use HasApplicationEmail, EmailsTrait; public function store(CreateApplicationRequest $request) { // ... 处理请求逻辑 ... } } // CreateApplicationRequest.php class CreateApplicationRequest extends FormRequest { public function rules() { return [ 'email' => ['required', 'email'], 'event_slug' => ['required'], 'application_fee' => ['required', 'numeric'], 'applicant_birthdate' => ['required'], 'applicant_gender' => ['required'], 'marital_status' => ['required'], 'applicant_street_1' => ['required'], 'applicant_city' => ['required'], 'applicant_state_province' => ['required'], 'applicant_zip' => ['required'], 'applicant_country' => ['required'], 'applicant_phone' => ['required'], 'transaction_number' => ['required'], ]; } public function authorize() { return true; } }

PS: 我真的快被这个问题逼疯了,求各位大佬救救孩子!😅

谢谢大家!

1 Answers

C

Coder小王

1/8/2025

Best Answer12

Answer #1 - Best Answer

嘿,你好啊!👋

我太理解你遇到的这个 Laravel 验证错误问题了,特别是当你处理 application/x-www-form-urlencoded 数据时。之前我也在类似的项目中遇到过这种情况,真的是让人头疼!😅

解决方案

Laravel 默认会将验证错误重定向回上一页,这在 API 场景下确实不太理想。为了让 Laravel 返回 JSON 格式的错误响应,你可以在 CreateApplicationRequest 中重写 failedValidation 方法。这样即使数据是 application/x-www-form-urlencoded,也能得到一个 JSON 响应。

以下是你可以尝试的代码:

// CreateApplicationRequest.php use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; class CreateApplicationRequest extends FormRequest { public function rules() { return [ 'email' => ['required', 'email'], 'event_slug' => ['required'], 'application_fee' => ['required', 'numeric'], 'applicant_birthdate' => ['required'], 'applicant_gender' => ['required'], 'marital_status' => ['required'], 'applicant_street_1' => ['required'], 'applicant_city' => ['required'], 'applicant_state_province' => ['required'], 'applicant_zip' => ['required'], 'applicant_country' => ['required'], 'applicant_phone' => ['required'], 'transaction_number' => ['required'], ]; } public function authorize() { return true; } protected function failedValidation(Validator $validator) { // 抛出一个 HTTP 响应异常,返回 JSON 格式的错误信息 throw new HttpResponseException(response()->json([ 'success' => false, 'errors' => $validator->errors() ], 422)); } }

个人经验小贴士

  • 调试技巧:在开发环境中,使用 Laravel 的日志功能来记录请求和响应数据,这样可以帮助你更快地定位问题。
  • 常见错误:确保你的 API 路由没有被 CSRF 中间件保护,因为这可能会导致请求被拒绝。
  • 测试工具:使用 Postman 或类似工具来模拟 application/x-www-form-urlencoded 请求,确保你的 API 能正确处理。

希望这些建议能帮到你!如果还有其他问题,随时来问,我很乐意帮忙。加油,你一定能搞定的!🚀

如果你需要进一步的帮助,别犹豫,随时联系我!😊

CloudFog API Gateway 🔥 New User Special

💥 New User Offer: Get $1 Credit for ¥0.5

Claim Offer Now