我有一个 Products 类来查找这些分页项,但在前端,我允许用户定义他想要每页显示多少项(10、30、50、100( 问题是,如果有人超过 1000,API 每页返回 1000 条记录。
如何为所有控制器和模型动态验证这一点?
我可以通过验证每个控制器上的每个请求("限制"(来"轻松"做到这一点,但这是不切实际的,我该怎么做?
public function index(Request $request)
{
$perPage = $request->input('limit'); // User input
$sort = 'global_performance';
$descending = 'desc';
$products = Product::where('status', 1)
->orderBy($sort, $descending)
->paginate($perPage); //
return $products;
}
您可以像这样验证限制:
public function index(Request $request)
{
$this->validate($request, [
'limit' => ['required', 'integer', Rule::in([10, 30, 50, 100])]
]);
$perPage = $request->input('limit'); // User input
$sort = 'global_performance';
$descending = 'desc';
$products = Product::where('status', 1)
->orderBy($sort, $descending)
->paginate($perPage); //
return $products;
}
现在,在控制器类之前添加以下行:
use IlluminateValidationRule;
更新
更动态的方式可能是创建自定义请求类,如下所示:
运行以下命令以创建新的表单请求类:
php artisan make:request PaginateRequest
这将PaginateRequest
目录中AppHttpRequests
类创建,如下所示:
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
class PaginateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
现在将此类更改为以下内容:
<?php
namespace AppHttpRequests;
use IlluminateValidationRule;
use IlluminateFoundationHttpFormRequest;
class PaginateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'limit' => ['required', 'integer', Rule::in([10, 30, 50, 100])]
];
}
}
在此之后,您可以通过将其添加为函数参数来在控制器函数中使用。
public function index(PaginateRequest $request)
{
$perPage = $request->input('limit'); // User input
$sort = 'global_performance';
$descending = 'desc';
$products = Product::where('status', 1)
->orderBy($sort, $descending)
->paginate($perPage); //
return $products;
}
请不要忘记在控制器类之前导入它,如下所示:
use AppHttpRequestsPaginateRequest;
这样,您可以在任何需要的地方使用此请求类。
您可以在以下文档中查看更多信息:https://laravel.com/docs/5.8/validation
您可以轻松创建中间件。只需将其从内核应用到每个路由,或者在路由文件中创建一个组以将其应用于选择性路由。
在中间件内部只需检查限制,如果为空或大于您想要的最大限制,例如 100,则将其设置为 100,如下所示:
$limit = $request->input('limit');
if (empty($limit) || ($limit > 100)) {
$request['limit'] = 100;
}
这不行吗?
这是 Laravel 中中间件的链接。