Нормального опису підходу я так і не знайшов (хіба що намітки тут). Зачитав офіційне керівництво до дірок, але прийоми записи пов'язані моделей в БД описані дуже скупо. читання документації по Active Record теж не особливо допомогло.
І все-таки хочеться розібратися з цим кодом, з цим підходом, зрозуміти, які можливості закладені в фреймворк, щоб не городити город поверх наявного.
Питання по коду:
- Як працюють сеттери в цьому прикладі? Звідки беруться значення, передані сетер ($ tags, $ cover, $ images.)?
- В який момент пишуться дані з пов'язаних моделей (теги, зображення, головне зображення) в базу даних?
- Чого не вистачає в цьому коді, щоб він запрацював?
Окремо хотілося б попросити посилань на репозиторії серйозних проектів, які використовують Yii2. Дуже хочеться подивитися на кращі практики в реальних складних проектах.
заданий 19 Листопада '15 о 15:08
$ Post-> load (Yii :: $ app-> request-> post () виконує завантаження моделі. Yii :: $ app-> request-> post () повертає масив, виду [ 'MyFormName [key]' => ' value]. в load для кожного властивості моделі з ім'ям key встановлюється значення, якщо для них існують правила валідації rules і дане поле прописано в сценарії.
getTags це релейшен. Служить для зв'язків ActiveRecord моделей. setTags хоч і виглядає як сетер (сетер, це функція викликається при зверненні до неіснуючого властивості), але в даному випадку це просто функція. Вона зберігає пов'язану модель за допомогою populateRelation і збільшує поточний лічильник $ this-> tags_count. До слова про проблему публічних властивостей, лічильник можна збільшити безпосередньо, без виклику метод setTags.
Як працюють сеттери в цьому прикладі? Звідки беруться значення, передані сетер ($ tags, $ cover, $ images.)?
setCover. setTags. setImages викликаються всередині моделі c звичайної передачею параметрів. Вважаю, вони повинні бути приватними і не викликатися з клієнтського коду (контролера).
В який момент пишуться дані з пов'язаних моделей (теги, зображення, головне зображення) в базу даних?
У момент виклику populateRelation в моделі відбувається заповнення пов'язаного релейшена. Збереження відбувається в контролері в момент save моделі.
Чого не вистачає в цьому коді, щоб він запрацював?
Написати все заново, використовуючи цей код тільки в якості прикладу. Вам же потрібен досвід, і це позбавить вас від необхідності думати про функції на кшталт setTagsString. які ніде не використовуються і вносять тільки плутанину. Також буде зрозуміло що для роботи методу getRelatedRecords у вас повинні бути заповнені таблиці images і tags.
Я рекомендую взяти цей розділ документації і по черзі пройтися по кожним функцій. Це довго, по всім я сам ще не пройшовся, але це дозволить отримати максимально повне уявлення про можливості ActiveRecord фреймворка, що не копаючись в коді сумнівної якості.
Не забуваємо в методі afterSave робити виклик методу успадкованого класу, як вказано в документації> When overriding this method, make sure you call the parent implementation so that the event is triggered. `Public function afterSave ($ insert, $ changedAttributes)
Як працюють сеттери в цьому прикладі? Звідки беруться значення, передані сетер ($ tags, $ cover, $ images.)?
Це PHP-магія. У базовому класі перевизначені методи __get і __set. які перетворять читання і запис атрибутів $ foo-> bar = $ baz-> qwe в виклики методів $ foo-> setBar ($ baz-> getQwe ()). Якщо магія не подобається, то можна викликати методи і безпосередньо.
По суті, це банальні геттери і сеттери. У деяких мовах є властивості (геттери і сеттери, об'єднані в єдину сутність), але PHP їх не підтримує.
В який момент пишуться дані з пов'язаних моделей (теги, зображення, головне зображення) в базу даних?
Коли викликається метод save у ActiveRecord. У цей момент дані валідіруются і, якщо валідація проходить, то записуються дані цієї ActiveRecord і всіх пов'язаних.
Чого не вистачає в цьому коді, щоб він запрацював?
На це питання неможливо відповісти, поки ви не скажете, що саме не працює.
Окремо хотілося б попросити посилань на репозиторії серйозних проектів, які використовують Yii2. Дуже хочеться подивитися на кращі практики в реальних складних проектах.
Oк. Це я розумію. Ось дивлюся я на контролер і бачу, як вантажаться дані з \ Yii :: $ app-> request-> post () [ 'Post'] в цей самий $ post. Тут все зрозуміло. Але от не впевнений, що цього достатньо для того, щоб пов'язані моделі теж були заповнені. Особливо цікавий у цьому відношенні метод setTagsString (), який як би сетер, але ніби й не сетер. По крайней мере, в моєму випадку пов'язані моделі не заповнюються. $ This-> getRelatedRecords () в beforeSeve () і afterSave () нічого не повертають, власне, магії не трапляється. - Denis Khvorostin 19 Листопада '15 о 16:17