POV
POV

Reputation: 12025

How to use custom validation in FormRequest?

I have class:

class CreateInvoiceRequest extends FormRequest
{
    public function messages()
    {
        return [
            'name' => 'required|string',
            'code' => 'required|string|unique: enterprise_invoces,code',
        ];
    }

    public function rules()
    {
        return [
            'name' => 'required|string',
            'code' => 'required|string|unique: enterprise_invoces,code',
        ];
    }
}

Also a custom validation class:

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class InvoiceCode implements Rule
{
    public function passes($attribute, $value)
    {
        //
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The invoice code sholud be in formar <number>.<number>';
    }
}

How to apply InvoiceCode rule for validator inside:

public function rules()
{
    return [
        'name' => 'required|string',
        'code' => 'required|string|unique: enterprise_invoces,code',
    ];
}

I tried this:

 return [
                    'name' => 'required|string',
                    'code' => 'required|string|unique: enterprise_invoces,code',
                    'code' => new InvoiceCode()
                ];

Upvotes: 0

Views: 181

Answers (2)

First of all, your messages method on the FormRequest class is not correct. If you want to override the default messages the syntax should be:

public function messages()
{
    return [
        'name.required' => 'The name is required.',
        'name.string' => 'The name should be a string',

        // keep adding the messages for the rules you want to override
    ];
}

For the rules method, it is common to use an array when you have multiple rules for an attribute to make it easier to read and if you need to include more complex logic. It should look like this


public function rules()
{
    return [
        'name' => 'required|string',
        'code' => [
            'required',
            'string',
            'unique:enterprise_invoices,code', //you misspelled enterprise_invoices in your code
            new InvoiceCode
        ],
    ];
}

Upvotes: 1

Tom Headifen
Tom Headifen

Reputation: 1996

You have duplicate keys in your rules array in your last code snippet.

To define a custom rule with a built in rule you can pass in an array instead of a string like so:

return [
    'name' => 'required|string',
    'code' => ['required', 'string', 'unique: enterprise_invoces,code', new InvoiceCode()],
];

This is documented here: https://laravel.com/docs/5.8/validation#custom-validation-rules

Upvotes: 1

Related Questions