Laravel中PATCH请求的if判断始终为true问题求助
问题原因与解决办法
核心问题
1. 路由参数格式错误
Laravel路由的参数分隔符应该是/,而非你用的&——&是URL查询参数的分隔符,用在路由参数里会导致后端解析异常,布尔值参数会被强制转为字符串。
2. PHP字符串的布尔判断逻辑
当你把false作为路由参数传递时,URL里会变成字符串"false"。在PHP中,所有非空字符串都会被判定为true,所以不管你传true还是false,if($favourite)的判断结果永远为真。
修复方案(推荐第一种)
方案一:用请求体传递布尔参数(符合REST规范)
修改Vue请求代码
把favourite参数放在请求体里,而非路由参数:
toggleFav(id, content) { this.isFavorite = !this.isFavorite; const currentCookies = VueCookies.get("FavId") ? VueCookies.get("FavId").split(',') : []; let arrayCookies = []; if (this.isFavorite) { arrayCookies = [...currentCookies, id]; VueCookies.set("FavId", arrayCookies.join(',')); this.$inertia.patch( this.route("addfavDB", [content, id]), { favourite: true } // 参数放请求体 ); } else { arrayCookies = currentCookies.filter(item => item != id); VueCookies.set("FavId", arrayCookies.join(',')); this.$inertia.patch( this.route("addfavDB", [content, id]), { favourite: false } // 参数放请求体 ); } },
修改Laravel路由
移除路由中的favourite参数:
Route::patch('docs/plants/{content}/{id}', [PlantCharacteristicController::class, "addFav"])->name('addfavDB');
修改控制器方法
用boolean()方法解析请求体中的布尔值:
public function addFav(){ $id = request('id'); $content = request('content'); // 正确解析布尔值,避免字符串判断误差 $favourite = request()->boolean('favourite'); if($favourite){ dd('added to db'); }else{ dd('removed from db'); } }
方案二:修正路由参数格式(不推荐,仅作备选)
如果一定要通过路由参数传递布尔值,需要手动转义并解析:
修改路由
用/分隔所有参数:
Route::patch('docs/plants/{content}/{id}/{favourite}', [PlantCharacteristicController::class, "addFav"])->name('addfavDB');
修改Vue请求
将布尔值转为字符串'true'/'false'传递:
// 收藏分支 this.$inertia.patch(this.route("addfavDB", [content, id, 'true'])); // 取消收藏分支 this.$inertia.patch(this.route("addfavDB", [content, id, 'false']));
修改控制器方法
将字符串参数转为布尔值:
public function addFav($content, $id, $favourite){ // 把字符串转为布尔值 $favourite = filter_var($favourite, FILTER_VALIDATE_BOOLEAN); if($favourite){ dd('added to db'); }else{ dd('removed from db'); } }
额外优化:Cookie数组处理
你原代码中currentCookies的处理会生成二维数组,建议改成一维数组的增删逻辑(已包含在方案一的Vue代码中),避免Cookie值格式混乱。
内容的提问来源于stack exchange,提问作者cherno304
相关产品推荐
相关产品推荐

