Как использовать пользовательскую проверку в FormRequest? - PullRequest
0 голосов
/ 01 мая 2019

У меня есть класс:

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',
        ];
    }
}

Также пользовательский класс проверки:

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>';
    }
}

Как применить InvoiceCode правило для валидатора внутри:

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

Я пробовал это:

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

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Прежде всего, ваш метод сообщений в классе FormRequest неверен.Если вы хотите переопределить сообщения по умолчанию, синтаксис должен быть следующим:

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
    ];
}

Для метода правил обычно используется массив, когда у вас есть несколько правил для атрибута, чтобы его было легче читать, и есливам нужно включить более сложную логику.Это должно выглядеть так


public function rules()
{
    return [
        'name' => 'required|string',
        'code' => [
            'required',
            'string',
            'unique:enterprise_invoices,code', //you misspelled enterprise_invoices in your code
            new InvoiceCode
        ],
    ];
}
1 голос
/ 01 мая 2019

У вас есть дубликаты ключей в вашем массиве правил в вашем последнем фрагменте кода.

Чтобы определить пользовательское правило со встроенным правилом, вы можете передать массив вместо строки, например:

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

Это задокументировано здесь: https://laravel.com/docs/5.8/validation#custom-validation-rules

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...