0

在我的 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文件中没有提到我的方法。

在不重复自己的情况下实现此功能的最灵活和优雅的方式是什么?

4

2 回答 2

1

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

如果你有一个控制器类,你可以在 action 方法中添加以下内容:

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

这将验证传入的请求并在不满足验证规则时抛出HttpResponseException 。

Laravel 的验证器是一个强大的工具 - 你可以在这里阅读更多关于它的信息:http: //laravel.com/docs/5.1/validation

于 2015-07-30T21:06:39.893 回答
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");
    }
}

我认为它会为你工作。

于 2015-07-31T11:49:22.153 回答