Laravel 5.1:处理RESTful API中缺少的字段

时间:2015-07-30 20:39:06

标签: php laravel laravel-5 laravel-middleware

在我的Laravel 5.1应用程序中,我有一个用作RESTful API的控制器。该控制器的许多方法都有以下代码:

foreach (['email', 'password', 'firstName', 'lastName'] as $parameter) {
    if (!$this->request->has($parameter)) {
        throw new InputException(400, $parameter, 'Missing ' . $parameter . ' parameter.');
    }
}

我知道重复同一段代码(具有不同的数组内容)并不是最好的主意。相反,我正在寻找一种优雅的方式来实现同样的目标。

我想过带有参数的中间件,在routes.php中是这样的:

'middleware' => 'parameters:email,password,firstName,lastName'

目前我使用隐式控制器,因此routes.php文件中未提及我的方法。

实现此功能的最灵活,最优雅的方法是什么,而不重复自己?

2 个答案:

答案 0 :(得分:1)

Laravel的验证器就是您所需要的。

如果您有控制器类,则只需在操作方法中添加以下内容:

 $this->validate($this->request, [
    'email' => 'required|email',
    'password' => 'required',
    'firstname' => 'required',
    'lastname' => 'required',
]);

如果不符合验证规则,这将验证传入的请求并抛出 HttpResponseException

Laravel的验证器是一个功能强大的工具 - 您可以在此处阅读更多相关信息:http://laravel.com/docs/5.1/validation

答案 1 :(得分:0)

我认为,中间件将是最好的选择。中间件很棒。 只需使用php artisan make:middleware SomeMiddlewareName

创建中间件即可

并将此代码放在其句柄函数

public function handle($request, Closure $next)
{

    $data = array(
        'email' => $request->input('email'),
        'password' => $request->input('password'),
        'firstname' => $request->input('firstname'),
        'lastname' => $request->input('lastname'),
    );

    //Delete array fields that Have null or empty values
    $data = array_filter($data);

    if (sizeof($data) == 4) {
            //Send the user to the required controller
            return $next($request);
    } else {
        //Else, throw whatever error you want to throw
        throw new InputException("Enter all required parameters");
    }
}

我认为这对你有用。