Is it possible to add names and descriptions for validation rules in the laravel request class

I have a request class:

class UpdateProductRequest extends ApiRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name'        => 'required',
            'description' => 'required',
        ];
    }
}

But I want something similar to:

class UpdateProductRequest extends ApiRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name'=> [
                'name' => 'Product name',
                'description' => 'Product name description',
                'validation' => 'required',
                'type' => 'string',
            ],
            'description'=> [
                'name' => 'Product description',
                'description' => 'Product description description',
                'validation' => 'required',
                'type' => 'string',
            ]
        ];
    }
}

Because I want to use this extra data for the Rest API documentation. I do not want to duplicate names like this:

class UpdateProductRequest extends ApiRequest
{
    public function authorize()
    {
        return true;
    }

    public function apiData(){
        return [
            'name'=> [
                'name' => 'Product name',
                'description' => 'Product name description',
                'type' => 'string',
            ],
            'description'=> [
                'name' => 'Product description',
                'description' => 'Product description description',
                'type' => 'string',
            ]
        ];
    }

    public function rules()
    {
        return [
            'name'        => 'required',
            'description' => 'required',
        ];
    }
}
+4
source share
1 answer

You can do rulesto use apiDataas below:

class UpdateProductRequest extends ApiRequest
{
    public function authorize()
    {
        return true;
    }

    public function apiData()
    {
        return [
            'name'=> [
                'name' => 'Product name',
                'description' => 'Product name description',
                'validation' => 'required',
                'type' => 'string',
            ],
            'description'=> [
                'name' => 'Product description',
                'description' => 'Product description description',
                'validation' => 'required',
                'type' => 'string',
            ]
        ];
    }

    public function rules()
    {
        return array_map(function($item){
            return $item['validation'];
        }, $this->apiData());
    }
}

But it might be a good idea to see Swagger for documentation. There are several bindings for larave: https://packagist.org/search/?q=swagger%20laravel

EDIT:

rules - apiData, . apiData rules:

public function apiData()
{
    return array_diff_key(
        (new Requests\Backend\UpdateProductRequest)->apiData(),
        ['something' => false]
    );
}

public function rules()
{
    return array_map(function($item){
        return $item['validation'];
    }, $this->apiData());
}
+2

Source: https://habr.com/ru/post/1667252/


All Articles