Геттеры и сеттеры: магия и Yii2

При подготовке вебинара о событиях вспомнил, что в Yii2, в отличие от первой версии, события и поведения на компоненты приложения можно навесить через конфигурационный файл виртуальными свойствами. И я уже давно хотел рассказать о геттерах и сеттерах.

Так что пока провели вебинар по геттерам и сеттерам вообще и рассмотрели использование некоторых магических методов в Yii2: доступ к атрибутам ActiveRecord-модели, компонентам приложения, навешивание поведений и событий через свойства, получение связанных данных из отношений моделей:

Осталось немного рассказать про метод __call, но это мы сделаем на уроке про поведения. А следующий посвятим событиям в Yii2. Дату сообщу также в рассылке по вебинарам. Запишитесь, если ещё не с нами:

Если вдруг назрели интересные темы для следующих вебинаров, то можете предложить их в комментариях здесь или в первой статье. Спасибо за внимание!

Комментарии

 

Дмитрий

Спасибо за вебинары. Сам еще не смотрел, но думаю что ролик продолжительностью 2,5 часа дает исчерпывающую информацию.
Продолжай в том же духе.

Ответить

 

Даниил

Отличный материал! Спасибо большое!

Правильно ли я понимаю, что в более-менее крупных проектах стоит разделять, например операции входа, регистрации, редактирования пользователя в разные модели? Получается куча тонких моделей, каждая их которых отвечает за свою операцию.

Реквестирую вебинар по RBAC! Очень полезная и сложная тема, особенно учитывая, что это стандарт.

Ответить

 

Дмитрий Елисеев

По сути это без разницы. Но мне удобнее сделать отдельную форму, например, для смены пароля, чем таскать всюду одну модель с кучей сценариев.

Ответить

 

Папин

Классная статья Дмитрий, спасибо.

Я знаю что isset($array[$key]) проверяет, существует ли такой ключ и имеет ли значение или нет.
array_key_exists($key, $array) проверяет, существует ли такой ключ, не смотря на его значение.

Вопрос: Почему в __get функции BaseActiveRecord модели на первом сроке проверяется и то и другое?

if (isset($this->_attributes[$name]) || array_key_exists($name, $this->_attributes)) {...}
Ответить

 

Виктор

Большое спасибо за материал. Очень познавательно, несмотря на некоторую невнятицу в изложении. На мой взгляд, получилось гораздо лучше, чем в курсе по Git/Composer. Хотелось бы посоветовать делать упор не на детали внутренней структуры фреймворка, а на применение рассматриваемого материала на практике, как это сделано в известном челябинском курсе по YII1 или в книге Ларри Ульмана.
Поддерживаю идею проведения вебинара по кэшированию в YII2

Ответить

 

Uterm

Наоборот, делайте упор на внутреннюю структуру фреймворка. Этого как раз не хватает в интернете тем кто не участвует в создании yii2, не читает issue или у кого не очень с английским. Архитектуру фреймворка всеравно надо знать, и гораздо легче самому смотреть код, после просмотра вебинара, когда уже есть примерное представление.

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

Ответить

 

minority

Интересный симинар, поверхностно начал изучать yii, очень полезно для понимания внутренних вещей фреймворка.

Ответить

 

l-dar

Про RBAC хорошо бы послушать

Ответить

 

Александр

Большое спасибо Дмитрий за вебинары.
Проведите пожалуйста вебинар про RBAC.

Ответить

 

Sergey

Добрый день, Дмитрий!

Переведите пожалуйста, данные вебинары в текстовый вид(в статьи). Не всегда удобно смотреть 2+ часа видео :)
Спасибо!)

Ответить

 

Дмитрий Елисеев

Жена уже половину вебинара расшифровала. Так что текст в пути :)

Ответить

 

Andrewkha

очень интересный вебинар, спасибо. Вроде все понятно, надо просто еще раз все осознать

Ответить

 

Spirit Absolute

Заметен прогресс в изложении материала. Так держать! ;) Полезные видео!

Ответить

 

Иосиф

(по поводу предложения темы)
Кеширование, настроки кеширования, избирательное кеширование (подключение для этих целей хранилищ). В целом вопросы оптимизации в этом направлении.

П.с.: спасибо за ваш труд! Я подписался на канал, читаю ваши статьи. Круто!

Ответить

 

Максим

Возможно глупый вопрос, потому, что не знаю: А как на счет статических свойств? Почему их нельзя (не реализовано) через геттеры и сеттеры сделать? Что то в роде:

public static function getFilesParam() {
    return [
        'full' => ['width' => 800, 'height' => 600],
        'icon' => ['width' => 100, 'height' => 100],
    ]
}

Цель такова: перед тем как создавать объект необходимо из класса выдрать параметры изображений или еще чего.., что-то сделать, и только потом при определенных условиях создавать экземпляр и манипулировать...

Ответить

 

Максим

Цель такова: перед тем как создавать объект необходимо из класса выдрать параметры изображений или еще чего.., что-то сделать, и только потом при определенных условиях создавать экземпляр и манипулировать...

Ответить

 

Дмитрий Елисеев

А чем здесь Class::$fileParam будет удобнее, чем Class::getFilesParam() ?

Ответить

 

Дмитрий Медведев

Добрый день. Спасибо за интересный вебинар.
Было бы интересно послушать про базовые шаблоны проектирования и solid принципы, а так же применение этого всего в yii2.

Ответить

 

Дмитрий Елисеев

В самом фреймворке принципы SOLID редко применяются его авторами, так что исходники Yii2 - не лучший пример. А снаружи они применяются во всех проектах одинаково. Может придумаю что-нибудь на основе прошедшего интенсива по ООП, где мы это на двадцати примерах шесть дней обсуждали.

Ответить

 

Александр

Дмитрий, очень полезная информация в видео, но:
как именно в фреймворке с помощью Setter сохранить полученную от пользователя структуру (массив, json, html и.п.) в БД, т.е. где именно применяются Setter: view, controller или model?

Ответить

 

Дмитрий Елисеев
Ответить

 

Александр

Доброго дня, у меня вопрос в видео (время 35:29) вы говорите о геттерах и сеттерах и предлагаете такую конструкцию, чтоб работали гет и сет свойтсва класса:

public function __set($name, $value)
{
    $method = 'set' . ucfirst($name);
    if(method_exists($this, $method)){
        $this->$method($value);
    }
}

странно, без этой конструкции нормально работает просто:

public $_gname = '';

public function setGname($value) {
    $this->_gname = $value;
}

public function getGname()
{
    return $this->_gname;
}

и свойство сетится в класс, не объясните где я ошибаюсь, почему у меня работает?

Ответить

 

Дмитрий Елисеев

Это PHP так работает, что позволяет объектам несуществующие свойства присваивать вроде $model->gname = 'Name', автоматически делая их публичными. Но ваши setGname при этом не вызываются.

Ответить

 

Виталий

Хорошо было бы, если бы вы писать конспект к своим длинным видео роликам.

Сами видео хорошие

Ответить

Оставить комментарий

Войти | Завести аккаунт | Войти через


(никто не увидит)





Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>