Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 10.02.2017 11:06:50

Изменение Request до отработки Controller

Перед методом контроллера данный валидируются:

class CategoryRequest extends Request
.....
public function rules()
    {
        return [
            'id_parent' => 'exists:categories,id',
            'name' => 'required',
            'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
            'icon' => 'image'
        ];
    }

В контроллере если sysname не заполнен, то мы генерим его из name

public function store(\App\Http\Requests\admin\CategoryRequest $request) {
$data = $request->all();
$data['sysname'] = $data['sysname']  ?: Slug::make($data['name'], '_');

После чего нам необходимо опять проверить значение на уникальность в таблице.
Вопрос: как можно проверить $request->input('sysname') на пустоту и подставить значение до отработки CategoryRequest  чтобы избежать повторной проверки?

Не в сети

#2 10.02.2017 12:31:20

skiphog
Откуда: Киров, Россия
Сообщений: 26

Re: Изменение Request до отработки Controller

Как вариант, переопределить метод prepareForValidation() в CategoryRequest

class CategoryRequest extends Request
.....

protected function prepareForValidation()
{
  if(empty($this->request->get('sysname'))) {
    $this->request->set('sysname', Slug::make($this->request->get('name'), '_'));
      // Ну или еще как...
    }
  }


public function rules()
    {
        return [
            'id_parent' => 'exists:categories,id',
            'name' => 'required',
            'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
            'icon' => 'image'
        ];
    }

Т.е. получается, что перед валидацией проверяем, если пустой sysname, то вставляем значение, которое нужно.

Так будет точно работать, но... возможно, можно как-то и по другому...

Не в сети

#3 10.02.2017 12:51:57

Re: Изменение Request до отработки Controller

skiphog пишет:

Как вариант, переопределить метод prepareForValidation() в CategoryRequest

class CategoryRequest extends Request
.....

protected function prepareForValidation()
{
  if(empty($this->request->get('sysname'))) {
    $this->request->set('sysname', Slug::make($this->request->get('name'), '_'));
      // Ну или еще как...
    }
  }


public function rules()
    {
        return [
            'id_parent' => 'exists:categories,id',
            'name' => 'required',
            'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
            'icon' => 'image'
        ];
    }

Т.е. получается, что перед валидацией проверяем, если пустой sysname, то вставляем значение, которое нужно.

Так будет точно работать, но... возможно, можно как-то и по другому...

Не работает, в prepareForValidation даже не заходит. В документации такого метода не нашел. Уверены в его существовании?

Не в сети

#4 10.02.2017 13:02:43

skiphog
Откуда: Киров, Россия
Сообщений: 26

Re: Изменение Request до отработки Controller

Laravel 5.4
Request наследует FormRequest, который в свою очередь использует trait ValidatesWhenResolvedTrait там и есть пустой метод prepareForValidation

... Посмотрел 5.3 - тоже есть..

Не в сети

#5 10.02.2017 13:24:20

skiphog
Откуда: Киров, Россия
Сообщений: 26

Re: Изменение Request до отработки Controller

Да, в версиях ниже нет такого... видимо добавили позже, но тогда можно написать свой метод и вызвать до валидации.

class CategoryRequest extends Request
.....

public function validate()
    {
        $this->ВашМетод();
        parent::validate();
    }


private function ВашМетод()
{
  if(empty($this->request->get('sysname'))) {
    $this->request->set('sysname', Slug::make($this->request->get('name'), '_'));
      // Ну или еще как...
    }
  }


public function rules()
    {
        return [
            'id_parent' => 'exists:categories,id',
            'name' => 'required',
            'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
            'icon' => 'image'
        ];
    }

Не в сети

#6 10.02.2017 13:36:27

Re: Изменение Request до отработки Controller

skiphog пишет:

Да, в версиях ниже нет такого... видимо добавили позже, но тогда можно написать свой метод и вызвать до валидации.

Так работает, большое спасибо.

Не в сети

Подвал раздела