Laravel 5, как запустить мутатор перед проверкой

Я очень зеленый в Laravel (первый проект), поэтому терпите меня, если я делаю ошибки новичка. Я пытаюсь создать этот проект во время работы через Laracasts, поэтому я использую его предложения. Я использую Laravel 5.4 и PHP 7.1.4

У меня есть флажок в форме для логического поля. Если флажок не установлен при отправке формы, он возвращает ноль. Я не хочу нулевых значений для логических значений, поэтому у меня есть валидатор, гарантирующий, что он принимает только значения true / false. Чтобы это работало, мне пришлось создать мутатор, чтобы изменить значение на false, если оно было нулевым.

У меня есть две модели, Item и ItemNote. Я пытаюсь создать ItemNote из модели Item. На странице Item есть место для добавления ItemNote, которое проходит через ItemNoteController, затем я вызываю метод в Item для добавления ItemNote. Проблема в том, что я не могу заставить работать мутатор в модели ItemNote, поэтому проверка завершается неудачно, потому что логическое поле (calendar_item) равно нулю.

Сначала я пытался создать ItemNote из отношения с Item, в соответствии с этим переполнением стека Мутаторы Laravel 5 работают только когда я создаю запись, а не когда я обновляю запись Ответ мутатор не запустится при создании через отношение $ this-> notes () -> create ($ request-> all ()). Вы должны использовать модель $ this-> notes-> create ($ request-> all ()), заметив отсутствие скобок после заметок. Поэтому я перепробовал все, что мог придумать, чтобы попытаться создать объект с помощью модели, и все еще не могу запустить мутатор.

Вот объявления отношений в моих моделях:

Вещь

public function notes() { return $this->hasMany(ItemNote::class); }

ItemNote

public function item() { return $this->belongsTo(Item::class); }

Мутатор в ItemNote для calendar_item

protected function setCalendarItemAttribute($value) { $this->attributes['calendar_item'] = isset($value) ? $value : FALSE; }

Правила проверки в ItemNote

public static $validationRules = array('note_date' => 'required|date',
'resolve_date' => 'nullable|date',
'notes' => 'required|string',
'cost' => 'nullable|numeric',
'calendar_item' => 'required|boolean',
'attachment_path' => 'nullable|string|max:200');

Это действие в ItemNoteController, которое выполняется при добавлении ItemNote со страницы Item.

public function store(Item $item)
{
$this->validate(request(), ItemNote::$validationRules);

$item->addNote(new ItemNote(request(['item_note_category_id', 'note_date', 'resolve_date',
'notes', 'cost', 'calendar_item', 'attachment_path'])));

return back();
}

Вот функция addNote в модели Item

public function addNote(ItemNote $note)
{
$this->item_note->save($note);
}

Вот разные вещи, которые я пробовал в addNote, все они не запускают мутатор. У операторов create есть перечисленные назначения полей, но я удалил их здесь для краткости.

$this->notes->save($note);
$this->notes()->save($note);
$this->item_note->save($note);
$this->notes->create
$this->item_notes->create
$this->item_notes()->create
$this->item_note->create
$this->item_note()->create
$this->ItemNote->create
$this->ItemNote()->create
ItemNote::create

Все вышеперечисленное работает, хотя я думаю, что $ this-> item_notes-> create не должно работать вообще, потому что имя отношения — это примечания, но оно не жалуется, что заставляет меня думать, что оно может не попасть в этот код, и это не удалось выполнить оператор проверки в контроллере. Как мне запустить мутаторы до проверки? Или есть лучший способ очистить данные перед проверкой?

Я также попытался поместить поле item_id в правила валидации, но это не всегда получается, потому что item_id не назначается, пока я не создаю объект через отношения. Я хотел бы потребовать это, но не выяснил, как назначить это в запросе.

Любая помощь приветствуется. Простите за длинный пост.

0

Решение

Ваши мутаторы на вашей модели. В то время как вы используете ValidatesRequests черта контроллера для проверки ваших входных данных запроса. Таким образом, ваши мутаторы будут вызываться только после того, как вы запустите проверку.

Поэтому я вижу, что у вас есть два варианта.

а. Измените ваш HTML, чтобы всегда получать логическое значение. Например, используйте скрытый ввод со значением по умолчанию. Это значение будет отправлено только, если флажок не установлен.

<input name="example" type="hidden" value="0">
<input name="example" type="checkbox" value="1">

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

$itemNote = new ItemNote($request->all());
$request->merge($itemNote->toArray());

$this->validate($request, ItemNote::$validationRules);
// ...

Изменить: Вот несколько ссылок на мою проверку модели. Это может быть полезно и дать вам свои собственные идеи.

https://gist.github.com/robsimpkins/2fe0de2483d51f1e4446ec90be7d96ae
https://gist.github.com/robsimpkins/6a2f20853a2d01260ab299ebcebf9673
https://gist.github.com/robsimpkins/7df10abce1cdc07593d8c872a5461425
https://gist.github.com/robsimpkins/c4aa0517a80b794a2d347912100bd6d9

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector