Основы Laravel 5
Продолжаем тему добавление новой записи на нашем Laravel сайте.
По сути в метод create() мы передали некий, скажем так, хаотичный массив данных. Этот массив помимо нужных полей содержит 1) Не нужные поля - те поля которых нет в таблице posts ( "_token" ) 2) Поля с неверным содержимым - поле published у нас равно "on", а ожидается 1/0 (true/false). Соответственно Laravel не выполнил наш запрос и вывел ошибку.
Для того чтобы подобная операция завершилась успешно нам надо сообщить Laravel какие именно значения массива следует использовать. Для этого в модели Post запишем следующий код:
class Post extends Model { protected $fillable = ['title', 'slug', 'excerpt', 'content', 'published_at', 'published']; ... }
Теперь Laravel знает какие поля нам нужны и только их и использует. И если мы попробуем добавить новую запись заполнив все поля верно (валидации у нас пока еще нет, по этому допустим идеальные условия), то запись добавится.
НО. Мы получим два недочета. 1) поле published у нас всегда будет 0 так как данные приходят не те которые нам нужны 2) Дата публикации будет без учета времени.
В Laravel есть возможность подмены входных параметров. То есть создается определенный метод который является промежуточным и в этом методе мы можем посмотреть что пришло и заменить на нужное значение. С помощью такого функционала мы решим две наши проблемы.
static function create(array $attributes) { parent::create($attributes); } public function setPublishedAttribute($enabled) { $this->attributes['published'] = empty($enabled) ? 0 : 1; } public function setPublishedAtAttribute($date) { $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date); }
Метод обработчик должен именоваться следующим образом - set<ИмяАтрибута>Attribute(<переменная>);
Такми образом для поля published мы проверяем факт наличия того что вообще что-то пришло (как вы помните если поставить галку, то к нам приходит значение "on", если не поставить то вообще ничего), то устанавливаем значение атрибута в 1, а если ничего не пришло, то в 0;
Точно так же и добавляем время для даты публикации (устанавливаем текущее).