如何在移动应用程序的 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 验证器的主要内容,如果未能解决你的问题,请参考以下文章

当我们移动到另一个视图时如何停止 web 服务调用

如何将数据从服务器发送到Android?

如何从 Windows 命令提示符在 Laravel 中运行 PHPUnit

小米直达服务探秘:如何保证移动Web体验?

如何以编程方式在 iPhone 应用程序中从左到右移动文本? [关闭]

如何在我的移动设备上存储配置信息?