Reputation: 12025
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
Reputation: 278
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
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