Если у Вас не работают наблюдатели, рекомендую следующее: 1. Досмотреть видео до конца, т.к. о том как зарегистрировать наблюдателей через сервис-провайдер рассказывается в конце (22:00). 2. Зарегистрировать наблюдателей через сервис-провайдер в методе boot(). 3. Если создаете свой сервис-провайдер: 3.1. Проверить зарегистрирован ли Ваш сервис-провайдер в котором Вы зарегистрировали наблюдателей: dd(app()) 3.2. Если Вы уверены что Ваш сервис провайдер создан и зарегистрирован в config/app.php, но dd(app()) не показывает Ваш сервис-провайдер в списке сервис-провайдеров - пропишите в консоли: - composer dump-autoload - php artisan config:cache Надеюсь это сообщение поможет кому-то сэкономить время. Ставьте лайк, чтобы сообщение показывалось выше.
@@DmitryAfanasyev Как лучше регистрировать обсервер, через сервис-провайдер (я так понимаю он будет загружеться всегда) или $this->model->oserve(BlogPostObserver::class) в конструкторе нашего BlogPostRepository? (если правильно понимаю тут он будет грузиться при обращегии к модели)
Можно и так и эдак. Плюс регистрации в модели - сразу появляется понимание что есть наблюдатель и происходят доп операции при манипуляции с моделью. Плюс регистрации в сервис провайдере - всё в одном месте скумулирована и видна вся картина - сколько обсерверов и для каких моделей. Выбирай сам как тебе удобно. Когда и как они подгружаются, всегда или при обращении - не исследовал. Найдёшь ответ - просвети плз!
@@DmitryAfanasyev Из практики, количество обсерверов в проектах обычно не велико? Представил проект на 50-70 моделей с таким же количеством обсерверов. Посмотрел, что если через сервис провайдер загружать, то ничего дополнительного на старте не подгружается. Интересно, что при выполнении сохранения после редактирования класс обсервера создается дважды.
Lava 8 doc : To register an observer, you need to call the observe method on the model you wish to observe. You may register observers in the boot method of your application's App\Providers\EventServiceProvider .
Досмотрел до тестирования. Протестировал. Как у автора не получилось. Дальнейшие действия: Обновлялся по апдейт гайду Тейлора первая мысль что-то не так сделал. Вернулся назад просмотрел еще раз, проверил. Результатов не дало. Вернулся назад сделал как в видео по переходу на 5.8. Результат тот же. Опять пересмотрел, проверил. Ошибок не нашел. Полез в документацию ларавел->обсервер. Подключил))) Все заработало))) Продолжил смотреть и..... 22:00. На все про все потрачено 2 дня(с перерывами на работу))). Я не знаю как себя после этого назвать))) Вывод: не стоит спешить)))))) P.S. Автору за труд спасибо. Очень жду уроков про слушатели
фаааааааааак, сам щас час сидел искал где же я забыл чо написать. Тоже задумался почему мы нигде не указали что у нас есть обсерверы, но подумал что ларка сама как то там хитро линкует эти вещи. Спасибо))
@@SLA-Z7 ничерта не очевидно. Тут бывают начинающие совсем. И при воспроизведении урока может быть совсем не очевидно почему не получается так как у автора урока. Сразу лезешь в комментарии и видишь там ответ - не теряешь время.
01:40 - Observer - теория 05:00 - BlogPostObserver, BlogCategoryObserver 10:40 - методы/события обзервера BlogPost для выполнения ДО основной операции 12:10 - полезные методы модели для обсервера 22:00 - регистрация обзервера 23:25 - архитектура хранения обзерверов
Спасибо за уроки. При выполнении команды php artisan make:observer namespace модели нужно указаывать в одинарных кавычках, если в нем содержатся слэши: php artisan make:observer BlogCategoryObserver --model='Models\BlogCategory'.
Не знаю та же тема или не, Но вроде как альтернативный вариант - писать слеши в другую стороную. Когда я сделал как на видео, то у меня ларка не так обсерверов поименовала и пути к моделям не правильно прописала в них, исправлял руками.
Топ донатеры: ► Константин [ ⚝ Меценат ] Сообщение: "Спасибо за отличные уроки по Laravel"; . ► Дмитрий Лейко Сообщение: "Спасибо за уроки!!! Удачи!"; . ► Andrew Сообщение: "На пиуко) P.S. Спасибо за крутой курс!"; . ► Виталий Котов Сообщение: "Привет! Спасибо за видео, но к сожалению застрял в самом начале, не могу двигаться дальше, интернет перерыл, но по английски я не очень(что бы читать форумы), а по русски не нашел ничего, а что нашел, то не работает. Ответь пожалуйста на мой вопрос.."; . ► Паша Гудман Сообщение: "Не так давно наткнулся на ваш канал с целью грамотного подхода к изучению Laravel и, в целом, процесса разработки. Спасибо за то, что вы делаете. Удачи в вашем деле."; . ► Ярослав; . ► Дмитрий Сообщение: "Спасибо за уроки, смотрю параллельно еще курс, такой нудный в отличие от твоего, так держать" ; . ► Руслан Васильчиков Сообщение: "Наконец-то я продвинулся дальше миграций в изучении Laravel. ** * как-то не зашел ;)" ; . ► Александр; . ► Бахтиёр ; Спасибо за поддержку, друзья!;
Еще можно немного апнуть генерацию слага Если есть 2 статьи с одинаковым заголовком, то слаг, который в таблице unique, сгенерит одинаковый для обоих постов я накинул метод класса обсервера, который чекает не занятый ли слаг, а в апдейте в цикле докидую циферки если занят так для двух статей с заголвком Title, слаги будут title и title_1 соответственно protected static function isFreeSlug($slug, $except_id) { return !BlogPost::where('slug', '=', $slug)->where('id', '', $except_id)->exists(); } protected function setSlug(BlogPost $blogPost) { if (empty($blogPost->slug)) { $slug = str_slug($blogPost->title); $i = 0; while(true) { if (BlogPostObserver::isFreeSlug($slug, $blogPost->id)) { break; } else { $slug .= "_" . strval(++$i); } } $blogPost->slug = $slug; } }
Спасибо за видео. Такой вопрос, каким образом лучше сделать sync для many-to-many отношений? В Observer-е сохраняемой модели это не возможно, выходит или в контроллере или есть более правильный способ?
Привет Дмитрий, спасибо ище раз за курс. У меня вопрос :) Мы поставили в базе категорий и постов индекс SLUG - UNIQUE и когда я прописываю SLUG который уже существоем у меня ошибка. Где лучше всего поставить проверку на существование слага ? В том же Observer?
Спасибо! Все хорошо, все понятно! Есть ли еще отличия обработки событий через обсервер от обработки через события - подписчики? Такое впечатление что обсервер отрабатывает самым последним. П.С. Комменты и доки надо писать в стиле Laravel (каждая следующая строка на три символа короче предыдущей!) :-)
Спасибо за качественный материал. Понятнее некуда. Есть вопросы: 1. В конце видео сказано, что можно вынести в обсерверы в отдельный service provider. Как это сделать? 2. Как изучать laravel не только по документации? Например, в видео используются методы isDirty, getOriginal, а в документации их нет, как узнавать об этом?
1) Создаешь новый файл (php artisan make:provider ObserversServiceProvider) и все обсерверы инициализируешь там.2) laravel.com/api/master/Illuminate/Database/Eloquent/Concerns/HasAttributes.html#method_isDirty
да, тоже с Yii2 слажу увидел такую неприятность, но фиксится очень отлично, проперти прописываются в модели и во вью если через иде хелпер пересканировать модели или одну вновь созданную модель ./artisan ide-helper:model
@@DrZlad на Yii2 около 6 лет проработал, в принципе оч легкий для понимания фреймворк, для мелких проектов и средних очень подходит. Из минусов это вкряченный в ядро бутстрап 3 и жыквери, были проблемы когда жыквери обновишь и сыпятся компоненты сторонние, от картика того же .... еще конечно шаг в лево шаг в право при использовании сторонних виджетов и пакетов вызывал гемор, хотелось плюнуть и написать свою реализацию ))) так иногда и делал. Yii2 мне нормально послужил так инструментарием , но сейчас проблема в том, что выходит Yii3, да и только по СНГ Yii2 популярен, поэтому пошел в лару, лара мне кажется шире по возможностям, полаконичнее все как то )
Погугли о значениях этих методов. И о нюансах их использования. Возможно что-то упустил. Например saving доджен возвращать тру - тогда сохранение пройдет, или фолс - тогда отмена сохранения.
Дмитрий уроки просто пушка!) Хотел спросить, можно ли (вообще правильно ли) регистрировать Observer внутри модели а не в AppServiceProvider? Вроде как есть нарушение SOLID (дополнительная обязанность, но код регистрации маленький да и AppServiceProvider будет чище) Интересно услышать ваше мнение.
Полагаю можно и так и эдак. Принципы солид сделаны для того чтобы приложение сделать более понятным и поддатливым к изменениям. Даже если и есть "нарушение" оно никак не вредит.
Замечу про отличия updating от updated, это разные методы. У меня артизан автоматически updated проставил вместо updating, поэтому статья не обновлялась. Вручную прописать нужно на updating, чтобы можно было изменить данные до передачи в БД. Если я правильно понял, updated это уже работа метода после обновления БД.
Дмитрий подскажите пожалуйста, обеспечивают ли Observers 100% срабатывание и выполнение кода при наступлении события? (Например необходимо вести таблицу-журнал действий пользователя, как вариант можно в методе Observer'a created создать запись в лога в бд, не произойдет ли случаев что лог не записался но основная сущность создалась?)
Обсервер сработает всегда при условии работы с моделью записи. Не сработает если идти в обход (\DB::) или с помощью класса модели обновить группу записей.
isDirty() наверное без толку использовать - это событие вообще не вызывается, если модель не изменена Логирую в updating() текущий метод: если отправляю форму без изменений - не логирует, если изменяю в форме - появляется лог. Laravel Framework 6.13.1
Как на счет вместо выборки и проверки на сущ-ние модели по id в контроллере перенести в Request'ы в метод protected function prepareForValidation() { $this->merge([ 'id' => $this->route('post') ]); } и уже в public function rules() { return [ 'id' => 'bail|exists:blog_posts,id', ... ]; } Правда на 1 запрос больше получается
В мутаторах свойства изменяются сразу, а в обсервере непосредственно перед/после внесений изменений в бд. Очень разные механики. (Зачем педаль тормоза, если есть ручник - примерно тоже)
Дмитрий, а как быть, если, например, я хочу вести логирование всех изменений в бд? Кто отредактировал, кто удалил, кто создал запись. Как я понимаю, обсервер прикручивается к определенной модели. В голову пришла такая мысль. Создать BaseModel, отнаследовать от нее все модели, на BaseModel повесить обсервер, и логировать все изменения. Будет ли это работать? и если я создам обсервер на конкретную модель, а не на baseModel, перезапишет ли логику обсервер на конкретную модель и не пропадет ли логика с mainObserver? Как вообще на практике такое реализуется на опыте? Видел подобную реализацию через snapshots и behavior в другом фреймворке, менее популярном. Интересно ваше мнение! Заранее спасибо!
Еще в документации видел такие методы как getDirty() дл получения всех измененных полей. Но как это грамотно устроить пока не складывается в голове. Подскажите пжл куда смотреть
@@DmitryAfanasyev я точно не помню в каком месте , надо просмотреть, ты говорил в некоторых моментах "так неправильно но мы будем делать так, потомучто так делать положенно" ..... эти места заново не будете рассматривать с точки зрения "как надо бы на самом деле"
Что-то я тормознул второй день. Если я удаляю слаг, то ругается, что я пытаюсь в уникальное поле записать нул... Column 'slug' cannot be null. Получается у меня не срабатывает if (empty($blogPost->slug)) { $blogPost->slug = Str::slug($blogPost->title); } Не подскажите, что это значит?
@@DmitryAfanasyev да вроде, я ставлю dd($blogPost->slug, $blogPost->title); и получаю соответственно NULL и "Rerum aut numquam ex.", реальный заголовок.
Я могу ошибаться, где-то пропустил может, или у меня что то индивидуально пошло не так. Но столкнулся с ошибкой, при которой контролер не видит обсервера напрочь. Судя по документации - обсервер нужно отдельно подключить в классе AppServiceProvider, а в видео этого нет. Подключил и все заработало. Ошибки - это 50% обучения. laravel.com/docs/5.8/eloquent#observers Поправка - в самом конце видео есть работа с AppServiceProvider. Хитрый Дмитрий в фоне подключил обсерверы и ничего про это при создании не сказал. Ну... ошибка и просмотр доков тоже хорошо.
Если у Вас не работают наблюдатели, рекомендую следующее:
1. Досмотреть видео до конца, т.к. о том как зарегистрировать наблюдателей через сервис-провайдер рассказывается в конце (22:00).
2. Зарегистрировать наблюдателей через сервис-провайдер в методе boot().
3. Если создаете свой сервис-провайдер:
3.1. Проверить зарегистрирован ли Ваш сервис-провайдер в котором Вы зарегистрировали наблюдателей: dd(app())
3.2. Если Вы уверены что Ваш сервис провайдер создан и зарегистрирован в config/app.php, но dd(app()) не показывает Ваш сервис-провайдер в списке сервис-провайдеров - пропишите в консоли:
- composer dump-autoload
- php artisan config:cache
Надеюсь это сообщение поможет кому-то сэкономить время. Ставьте лайк, чтобы сообщение показывалось выше.
Прикрепил
@@DmitryAfanasyev Как лучше регистрировать обсервер, через сервис-провайдер (я так понимаю он будет загружеться всегда) или $this->model->oserve(BlogPostObserver::class) в конструкторе нашего BlogPostRepository? (если правильно понимаю тут он будет грузиться при обращегии к модели)
Можно и так и эдак. Плюс регистрации в модели - сразу появляется понимание что есть наблюдатель и происходят доп операции при манипуляции с моделью. Плюс регистрации в сервис провайдере - всё в одном месте скумулирована и видна вся картина - сколько обсерверов и для каких моделей. Выбирай сам как тебе удобно. Когда и как они подгружаются, всегда или при обращении - не исследовал. Найдёшь ответ - просвети плз!
@@DmitryAfanasyev Из практики, количество обсерверов в проектах обычно не велико?
Представил проект на 50-70 моделей с таким же количеством обсерверов.
Посмотрел, что если через сервис провайдер загружать, то ничего дополнительного на старте не подгружается. Интересно, что при выполнении сохранения после редактирования класс обсервера создается дважды.
Lava 8 doc : To register an observer, you need to call the observe method on the model you wish to observe. You may register observers in the boot method of your application's App\Providers\EventServiceProvider .
Спасибо. Одно из лучших для понимания видео, по моему мнению. Часто вы много теоритезируете и витьевато рассказывете. А тут лаконично и ясно.
Очень круто, спасибо вам! Все больше убеждаюсь, что чем больше я узнаю, тем больше понимаю что я нифига не знаю еще))
Терминал Linux команды:
php artisan make:observer BlogCategoryObserver --model=Models/BlogCategory
php artisan make:observer BlogPostObserver --model=Models/BlogPost
Это не линукс команды)) Это консольные команды ларавеля
Lava 8
php artisan make:observer BlogCategoryObserver --model=BlogCategory
php artisan make:observer BlogPostObserver --model=BlogPost
Оболдеть так в ларавел реализовано реактивной програмирование reative x, своя интепритация, но идея схожая
С каждым уроком мир программирования для меня расширяется)). Спасибо за видео!
Досмотрел до тестирования. Протестировал. Как у автора не получилось. Дальнейшие действия:
Обновлялся по апдейт гайду Тейлора первая мысль что-то не так сделал. Вернулся назад просмотрел еще раз, проверил. Результатов не дало. Вернулся назад сделал как в видео по переходу на 5.8. Результат тот же. Опять пересмотрел, проверил. Ошибок не нашел. Полез в документацию ларавел->обсервер. Подключил))) Все заработало))) Продолжил смотреть и..... 22:00. На все про все потрачено 2 дня(с перерывами на работу))). Я не знаю как себя после этого назвать))) Вывод: не стоит спешить))))))
P.S. Автору за труд спасибо. Очень жду уроков про слушатели
На самом деле время не потрачено. Навык поиска ошибок очень важен. Его ты и потренировал сейчас.
фаааааааааак, сам щас час сидел искал где же я забыл чо написать. Тоже задумался почему мы нигде не указали что у нас есть обсерверы, но подумал что ларка сама как то там хитро линкует эти вещи. Спасибо))
Можно было и подробнее описать вот в этом месте...
> Полез в документацию ларавел->обсервер. Подключил)))
@@jurafree426 ну это же очевидно... Это элементарные основы ООП. Прекращай смешить народ. Тут порой и так смешно бывает ))))))))))))))
@@SLA-Z7 ничерта не очевидно. Тут бывают начинающие совсем. И при воспроизведении урока может быть совсем не очевидно почему не получается так как у автора урока. Сразу лезешь в комментарии и видишь там ответ - не теряешь время.
Отличный курс. Почти 90% получается с первой попытки. Остальные 10% - невнимательность. Спасибо, Дима! Всего тебе самого хорошего!
01:40 - Observer - теория
05:00 - BlogPostObserver, BlogCategoryObserver
10:40 - методы/события обзервера BlogPost для выполнения ДО основной операции
12:10 - полезные методы модели для обсервера
22:00 - регистрация обзервера
23:25 - архитектура хранения обзерверов
Спасибо за уроки. При выполнении команды php artisan make:observer namespace модели нужно указаывать в одинарных кавычках, если в нем содержатся слэши: php artisan make:observer BlogCategoryObserver --model='Models\BlogCategory'.
красавчег))не пришлось биться головой что не так)
Не знаю та же тема или не, Но вроде как альтернативный вариант - писать слеши в другую стороную. Когда я сделал как на видео, то у меня ларка не так обсерверов поименовала и пути к моделям не правильно прописала в них, исправлял руками.
@@квадратя
В линуксе в обратную сторону слэш в терминале для пути
Топ донатеры:
► Константин [ ⚝ Меценат ]
Сообщение: "Спасибо за отличные уроки по Laravel";
.
► Дмитрий Лейко
Сообщение: "Спасибо за уроки!!! Удачи!";
.
► Andrew
Сообщение: "На пиуко) P.S. Спасибо за крутой курс!";
.
► Виталий Котов
Сообщение: "Привет! Спасибо за видео, но к сожалению застрял в самом начале, не могу двигаться дальше, интернет перерыл, но по английски я не очень(что бы читать форумы), а по русски не нашел ничего, а что нашел, то не работает. Ответь пожалуйста на мой вопрос..";
.
► Паша Гудман
Сообщение: "Не так давно наткнулся на ваш канал с целью грамотного подхода к изучению Laravel и, в целом, процесса разработки. Спасибо за то, что вы делаете. Удачи в вашем деле.";
.
► Ярослав;
.
► Дмитрий
Сообщение: "Спасибо за уроки, смотрю параллельно еще курс, такой нудный в отличие от твоего, так держать"
;
.
► Руслан Васильчиков
Сообщение: "Наконец-то я продвинулся дальше миграций в изучении Laravel. ** * как-то не зашел ;)"
;
.
► Александр;
.
► Бахтиёр
;
Спасибо за поддержку, друзья!;
Спасибо большое за видео урок, Дмитрий! Если делать всё по видео - то будет работать. Объяснение материала очень хорошее и понятное.
Благодарю!
Много чего узнал благодаря вашим урокам
Спасибо за очередную порцию полезной информации
отличный урок
Спасибо классный урок
Спасибо Вам большое!
Еще можно немного апнуть генерацию слага
Если есть 2 статьи с одинаковым заголовком, то слаг, который в таблице unique, сгенерит одинаковый для обоих постов
я накинул метод класса обсервера, который чекает не занятый ли слаг, а в апдейте в цикле докидую циферки если занят
так для двух статей с заголвком Title, слаги будут title и title_1 соответственно
protected static function isFreeSlug($slug, $except_id)
{
return !BlogPost::where('slug', '=', $slug)->where('id', '', $except_id)->exists();
}
protected function setSlug(BlogPost $blogPost)
{
if (empty($blogPost->slug)) {
$slug = str_slug($blogPost->title);
$i = 0;
while(true) {
if (BlogPostObserver::isFreeSlug($slug, $blogPost->id)) {
break;
} else {
$slug .= "_" . strval(++$i);
}
}
$blogPost->slug = $slug;
}
}
Как всегда плюс!
отлично
Обсервер для логики мутации полей ввода вывода.
репозиторий книжный шкаф, найти и выдать данные. Что тогда в модели хранить, только связи?
Спасибо
Danke!!!
Спасибо за видео. Такой вопрос, каким образом лучше сделать sync для many-to-many отношений? В Observer-е сохраняемой модели это не возможно, выходит или в контроллере или есть более правильный способ?
Привет Дмитрий, спасибо ище раз за курс. У меня вопрос :) Мы поставили в базе категорий и постов индекс SLUG - UNIQUE и когда я прописываю SLUG который уже существоем у меня ошибка. Где лучше всего поставить проверку на существование слага ? В том же Observer?
Спасибо за уроки еще раз. Правильно ли я понял, что обсы - это аналог триггеров sql на стероидах?
В какой-то степени. Обсервер можно обойти.
@@DmitryAfanasyev Понял. А за отзывчивость отдельное спасибо!
Спасибо! Все хорошо, все понятно! Есть ли еще отличия обработки событий через обсервер от обработки через события - подписчики? Такое впечатление что обсервер отрабатывает самым последним.
П.С. Комменты и доки надо писать в стиле Laravel (каждая следующая строка на три символа короче предыдущей!) :-)
Спасибо за качественный материал. Понятнее некуда. Есть вопросы:
1. В конце видео сказано, что можно вынести в обсерверы в отдельный service provider. Как это сделать?
2. Как изучать laravel не только по документации? Например, в видео используются методы isDirty, getOriginal, а в документации их нет, как узнавать об этом?
1) Создаешь новый файл (php artisan make:provider ObserversServiceProvider) и все обсерверы инициализируешь там.2) laravel.com/api/master/Illuminate/Database/Eloquent/Concerns/HasAttributes.html#method_isDirty
Спасибо за курс, очень удивлён, что при генерации модели не генерируется PHPDOC , в отличии от того же Yii2 с которого слезаю))
да, тоже с Yii2 слажу увидел такую неприятность, но фиксится очень отлично, проперти прописываются в модели и во вью если через иде хелпер пересканировать модели или одну вновь созданную модель ./artisan ide-helper:model
@@ВячеславЧенгал и как Вам Yii2? Чем хуже ларавеля?
и как Вам Yii2? Чем хуже ларавеля?
@@DrZlad на Yii2 около 6 лет проработал, в принципе оч легкий для понимания фреймворк, для мелких проектов и средних очень подходит. Из минусов это вкряченный в ядро бутстрап 3 и жыквери, были проблемы когда жыквери обновишь и сыпятся компоненты сторонние, от картика того же .... еще конечно шаг в лево шаг в право при использовании сторонних виджетов и пакетов вызывал гемор, хотелось плюнуть и написать свою реализацию ))) так иногда и делал. Yii2 мне нормально послужил так инструментарием , но сейчас проблема в том, что выходит Yii3, да и только по СНГ Yii2 популярен, поэтому пошел в лару, лара мне кажется шире по возможностям, полаконичнее все как то )
Почему-то у меня в BlogPostObserver сработало только при создании метода saving, а не updating
Погугли о значениях этих методов. И о нюансах их использования. Возможно что-то упустил. Например saving доджен возвращать тру - тогда сохранение пройдет, или фолс - тогда отмена сохранения.
Ошибся, в saving только ответ ===false будет отменой, все остальное одобрение.
Дмитрий уроки просто пушка!) Хотел спросить, можно ли (вообще правильно ли) регистрировать Observer внутри модели а не в AppServiceProvider? Вроде как есть нарушение SOLID (дополнительная обязанность, но код регистрации маленький да и AppServiceProvider будет чище) Интересно услышать ваше мнение.
Полагаю можно и так и эдак. Принципы солид сделаны для того чтобы приложение сделать более понятным и поддатливым к изменениям. Даже если и есть "нарушение" оно никак не вредит.
@@DmitryAfanasyev Спасибо за ответ. Успокоили ))
Замечу про отличия updating от updated, это разные методы. У меня артизан автоматически updated проставил вместо updating, поэтому статья не обновлялась. Вручную прописать нужно на updating, чтобы можно было изменить данные до передачи в БД.
Если я правильно понял, updated это уже работа метода после обновления БД.
А в видео что не так сказано?
Дмитрий подскажите пожалуйста, обеспечивают ли Observers 100% срабатывание и
выполнение кода при наступлении события?
(Например необходимо вести таблицу-журнал действий пользователя, как вариант можно в методе Observer'a created создать запись в лога в бд, не произойдет ли случаев что лог не записался но основная сущность создалась?)
Обсервер сработает всегда при условии работы с моделью записи. Не сработает если идти в обход (\DB::) или с помощью класса модели обновить группу записей.
@@DmitryAfanasyev Спасибо! А насколько он "транзакционный"? Откатится ли результат сохранение модели если в ее обсервере произшла ошибка?
зачем в BlogPostObserver:setPublishedAt проверка на empty($blogPost->published_at) ? это поле не передается, оно всегда пустое
isDirty() наверное без толку использовать - это событие вообще не вызывается, если модель не изменена
Логирую в updating() текущий метод: если отправляю форму без изменений - не логирует, если изменяю в форме - появляется лог.
Laravel Framework 6.13.1
Как на счет вместо выборки и проверки на сущ-ние модели по id в контроллере перенести в Request'ы в метод
protected function prepareForValidation()
{
$this->merge([
'id' => $this->route('post')
]);
}
и уже в
public function rules()
{
return [
'id' => 'bail|exists:blog_posts,id',
...
];
}
Правда на 1 запрос больше получается
Я чет не понял, методы обсервера должны иметь определенное название? Если нет, то тогда как модель понимает, какой метод у обсервера юзать при ивенте?
Да, методы обсервера должны правильно именоваться. Иначе не сработают.
Здраствуйте я хотел бы понять в чем смысл тогда в мутаторах, если есть observer?
В мутаторах свойства изменяются сразу, а в обсервере непосредственно перед/после внесений изменений в бд. Очень разные механики. (Зачем педаль тормоза, если есть ручник - примерно тоже)
@@DmitryAfanasyev Хорошо тогда, cпасибо за ответ - у меня были не правильные представление о мутаторах
Дмитрий, а как быть, если, например, я хочу вести логирование всех изменений в бд? Кто отредактировал, кто удалил, кто создал запись. Как я понимаю, обсервер прикручивается к определенной модели.
В голову пришла такая мысль. Создать BaseModel, отнаследовать от нее все модели, на BaseModel повесить обсервер, и логировать все изменения. Будет ли это работать? и если я создам обсервер на конкретную модель, а не на baseModel, перезапишет ли логику обсервер на конкретную модель и не пропадет ли логика с mainObserver?
Как вообще на практике такое реализуется на опыте?
Видел подобную реализацию через snapshots и behavior в другом фреймворке, менее популярном. Интересно ваше мнение! Заранее спасибо!
Еще в документации видел такие методы как getDirty() дл получения всех измененных полей. Но как это грамотно устроить пока не складывается в голове. Подскажите пжл куда смотреть
Slug на уникальность там не надо проверять?
По идее этим класс Request занимается, нет? Мы же указывали там в правилах
Спасибо! Может, всётаки не обсерверы, а ОБЗЁРВЕРЫ? :)))))
Это смотря под каким углом смотреть 😁
Дмитрий, когда финиш?.... ларавел не обновиться снова пока мы дойдем?
Да прям на этом видео можно и финишировать :D
@@DmitryAfanasyev )))), я нить потерял.
надо кое где заново вернуться
@@DmitryAfanasyev я точно не помню в каком месте , надо просмотреть, ты говорил в некоторых моментах
"так неправильно но мы будем делать так, потомучто так делать положенно" ..... эти места заново не будете рассматривать с точки зрения "как надо бы на самом деле"
теперь понятно. До этого почти добрались, но еще не близко.... Надо дать базу по джобам, коллекциям и тп.
@@DmitryAfanasyev Good!.... "законьчить привал !!!".... идем дальше
Что-то я тормознул второй день. Если я удаляю слаг, то ругается, что я пытаюсь в уникальное поле записать нул... Column 'slug' cannot be null. Получается у меня не срабатывает
if (empty($blogPost->slug)) {
$blogPost->slug = Str::slug($blogPost->title);
}
Не подскажите, что это значит?
Может и title пустой прилетает?
@@DmitryAfanasyev проверял, в title все в норме, прилетает. Если slug изменяю, изменяется, а вот если делаю пустым, ругается.
А в указанный выше блок кода вообще попадаем?
@@DmitryAfanasyev да вроде, я ставлю dd($blogPost->slug, $blogPost->title); и получаю соответственно NULL и "Rerum aut numquam ex.", реальный заголовок.
Я и внутри if проверил на всякий случай, и приходит slug "rerum-aut-numquam-ex" и title "Rerum aut numquam ex."
Я могу ошибаться, где-то пропустил может, или у меня что то индивидуально пошло не так. Но столкнулся с ошибкой, при которой контролер не видит обсервера напрочь. Судя по документации - обсервер нужно отдельно подключить в классе AppServiceProvider, а в видео этого нет. Подключил и все заработало. Ошибки - это 50% обучения. laravel.com/docs/5.8/eloquent#observers
Поправка - в самом конце видео есть работа с AppServiceProvider. Хитрый Дмитрий в фоне подключил обсерверы и ничего про это при создании не сказал. Ну... ошибка и просмотр доков тоже хорошо.
В видео есть подключение обсервера. В точности как в документации.....
такая же проблема, спасибо помог)
а в чем отличие от мутаторов?
Обсëр? Я что-то не расслышал. Или абсëр вэри?
Спасибо