如何在移动应用程序的 Web 服务中使用 Laravel 5.4 验证器
Posted
技术标签:
【中文标题】如何在移动应用程序的 Web 服务中使用 Laravel 5.4 验证器【英文标题】:How to use Laravel 5.4 validator at web service for mobile application 【发布时间】:2017-09-20 02:37:55 【问题描述】:我在使用 Laravel 5.4 验证器时遇到问题,我正在尝试验证来自移动应用程序的数据,但是当验证器失败时,它会重定向到主页。我需要阻止此重定向并返回带有验证错误消息的 json 响应 这是我的 route.php 代码
Route::group(['middleware' => 'web'], function()
Route::post('/userSignUp', [
'uses' => 'UserController@userSignUp',
'as' => 'userSingUp'
]);
);
这是我的控制器代码
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\MessageBag;
class UserController extends Controller
public function userSignUp(Request $request)
$fullName = $request->input('fullName');
$email = $request->input('email');
$phone = $request->input('phone');
$password = $request->input('password');
$userType = $request->input('userType');
$profilePic = $request->input('profilePic');
$validator = $this->validate($request, [
'fullName' => 'required|max:255',
'email' => 'required|email',
'phone' => 'required'
]);
if ($validator->fails())
return response()->json($validator->messages(), 200);
所以谁能帮我解决这个问题我需要在移动应用程序的 Web 服务中使用 laravel 5.4 验证器,所以我需要防止验证器重定向,因为它在验证时重定向到主页的上述代码失败 提前致谢
【问题讨论】:
【参考方案1】:如果调用 $this->validate($request,$rules)
时验证失败,laravel 将抛出异常,并通过 Illuminate\Foundation\Validation\ValidatesRequests
中定义的此方法发回失败的验证响应:
/**
* Create the response for when a request fails validation.
*
* @param \Illuminate\Http\Request $request
* @param array $errors
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function buildFailedValidationResponse(Request $request, array $errors)
if ($request->expectsJson())
return new JsonResponse($errors, 422);
return redirect()->to($this->getRedirectUrl())
->withInput($request->input())
->withErrors($errors, $this->errorBag());
看来 Laravel 确实通过检查 $request->expectsJson()
来处理这个问题,因此您需要在对 JSON 的请求中指定 Accept
标头,然后将返回带有代码 422
的 JSON 格式响应。
【讨论】:
我需要知道在哪里添加这个功能 你不需要添加这个函数,它是 laravel 代码的一部分,我正在向你展示如何处理失败的验证。您需要做的是在您发送的请求中指定您想要 JSON 响应。通过设置Accept
标头。
如果你允许我,我需要知道如何使用if($validator->fails())
因为我正在尝试使用它,但代码在它之前停止并返回一个 json 响应,我需要使用它来添加属性回复
我不太确定,因为返回了所有错误消息,所以我不需要自定义响应,但我认为您必须自己进行验证,而不是使用 validate 方法控制器。
我做到了,我使用验证器类来自定义我的手动验证。【参考方案2】:
return response()
->json(['name' => 'Abigail', 'state' => 'CA'])
->withCallback($request->input('callback'));
来自官方文档https://laravel.com/docs/5.4/responses#json-responses
也许尝试直接在模型中进行验证
class User extends Eloquent
private $rules = array(
'fullName' => 'required|max:255',
'email' => 'required|email',
'phone' => 'required|numeric'
);
public function validate($data)
// make a new validator object
$v = Validator::make($data, $this->rules);
// return the result
return $v->passes();
您可以在控制器中制作
$new = Input::all();
$u = new User();
if ($b->validate($new))
else
【讨论】:
你的意思是$u->validate($new))
不是 $b->validate($new))
我试图这样做,但我得到了那个错误 调用未定义的方法 Illuminate\Database\Query\Builder::validate()
是的,很抱歉,对于在您的控制器中调用未定义的方法 Illuminate\Database\Query\Builder::validate() 在您的案例中添加模型的命名空间,它使用 'App\用户的以上是关于如何在移动应用程序的 Web 服务中使用 Laravel 5.4 验证器的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Windows 命令提示符在 Laravel 中运行 PHPUnit