如何在laravel中动态设置每页的最大值?

时间:2019-07-16 11:34:07

标签: laravel laravel-5

我有一个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;
}

2 个答案:

答案 0 :(得分:4)

您可以这样验证限制:

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 Illuminate\Validation\Rule;

更新

更动态的方式可能是创建这样的自定义请求类:

运行以下命令以创建新的表单请求类:

php artisan make:request PaginateRequest

这将在PaginateRequest目录中创建App\Http\Requests类,如下所示:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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 App\Http\Requests;

use Illuminate\Validation\Rule;
use Illuminate\Foundation\Http\FormRequest;

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 App\Http\Requests\PaginateRequest;

通过这种方式,您可以在需要的任何地方使用此请求类。

您可以在这里的文档中找到更多信息:https://laravel.com/docs/5.8/validation

答案 1 :(得分:0)

您可以轻松创建中间件。只需将其从内核应用到每条路由,或在路由文件中创建一个组即可将其应用到选择性路由。

在中间件中只需检查限制,如果为空或大于您想要的最大限制,则将其设置为100,如下所示:

$limit = $request->input('limit');
if (empty($limit) || ($limit > 100)) {
   $request['limit'] = 100;
}

那行不通吗?

这里是link,用于Laravel中的中间件。