Пользовательское правило, основанное на двух значениях - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующая модель данных: Регион (id, name, country_id, tag). Этот тег является уникальным и состоит из имени + имени_ стран. Например:

name=Arizona 
countries_id=us 
tag=arizona-us

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

Я хочу создать правило проверки, которое проверяет свойство уникальности значения тега.

Мой код:

return array(
    'name' => ['required', new RegionUniqueRule()],
    'countries_id' => ['required', 'exists:mysql.countries,id'],
);

class Regionunique implements Rule
{
    public function passes($attribute, $value)
    {
        $countriesIdValue = 'COUNTRIES_ID VALUE !!!';
        $text = sprintf('%s %s', $value, $countriesIdValue);
        $table = DB::table('regions');
        $table->where('tag', str_slug($text));
        return ($table->first() === null);
    }

    public function message()
    {
        return 'The region already exists';
    }
}

Итак, как мне получить значение country_id внутри Regionunique?

1 Ответ

0 голосов
/ 07 мая 2018

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

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

abstract class Request extends FormRequest
{
    /**
     * Override Symfony\Component\HttpFoundation\Request::initialize.
     * After parent::initialize, run beforeValidation
     */
    public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
    {
         parent::initialize($query, $request, $attributes, $cookies, $files, $server, $content);
         $this->beforeValidation();
    }

    protected function beforeValidation()
    {
         //implement in child class
    }
}

class MyRequest extends Request
{
    protected function beforeValidation()
    {
         $tag = sprintf('%s %s', $this->input('name'), $this->input('countries_id'));
         $this->merge([
             'tag' => $tag,
         ]);
    }

     public function rules()
     {
         return array(
              'name' => ['required'],
              'countries_id' => ['required', 'exists:mysql.countries,id'],
              'tag' => ['required','unique'],
         );
     }
} 


class MyController
{
     public function myMethod(MyRequest $request)
     {
          //do something
     }
}

Здесь мы создаем новый абстрактный класс Request, который переопределяет функцию initialize(..) из framework. После инициализации базовый класс вызывает beforeValidation() для запуска чего-либо до проверки. Затем мы вставляем новое входное значение tag во входной массив и проверяем по правилу unique.

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