Читаю документацию по фреймворку, а тут такое...

Ну вот опять! Сел сочинить небольшой комментарий к посту на форуме и разошёлся на целую статью. В общем, публикую здесь. Кстати, заходите на форум. Там весело. Пока немного отдохнул после практикума. Оказалось, что двухмесячные курсы сильно выматывают расходами энергии на подготовку и проведение. Пришлось на два месяца забросить другие дела. Теперь пора с новыми силами возвращаться в блог.

Началось всё с ответа в топике на справедливый вопрос:

Читаю документацию по фреймворку. Уже понадеялся что-то человекопонятное увидеть, а тут такое...

Ответом хочу поддержать автора. Да, мало в сети документации, написанной «для самых маленьких». Тем более для Yii2, который появился совсем недавно. Да и даже не для новичков ещё не всё расписано. Что же с этим делать? Решение есть. Более затратное по времени, но очень полезное по результату.

Думал, чем разбавить статью и нашёл небольшой клип. Хоть про Java, но сойдёт:

И вернёмся к ответу:

Вполне логично, что документация по сложным фреймворкам пишется для людей, которые уже разбираются в PHP, ООП, SQL и большинстве паттернов и компонентов, которые в этом фреймворке используются. Согласитесь, что в университетский учебник по высшей математике глупо включать уроки сложения и таблицу умножения из начальной школы.

Так и в документацию по Yii2 глупо включать уроки о том, что такое переменная, что такое цикл, класс, статический метод, наследование, нормализация таблиц и внешние ключи. Если Yii1 был самодостаточным и, если ласково сказать, «детским» фреймворком первого поколения, был легко понятен для новичков (частично переходивших на него с CodeIgniter), то Yii2 – это уже серьёзный построенный на основе первого продукт из линейки Symfony и Laravel.

Плюс к тому, в Yii2 перекочевало много интересных вещей из других фреймворков и языков: компонентная структура, пакетный менеджер, пространства имён, полноценный Web-MVC, DI, новшества из PHP вроде замыканий, трейтов, позднего статического связывания и прочих. Более того, что...

...если все эти понятия вызывают у вас чувство лёгкого ужаса, то это нормально.

Фреймворки пишутся самими программистами для себя и для других программистов. И все эти программисты живут в одном мире, учатся друг у друга, читают статьи и берут друг у друга интересные подходы.

Девушка думает

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

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

Именно по этим причинам учиться программированию только по документации одного сложного фреймворка – не очень хороший путь. Нужно начать с уровней ниже. Каждую мелочь из этого составного букета можно изучить отдельно как в приведённом мной там же на форуме личном примере:

«PHP 5» Гутманса кроме конструкций самого языка научит работать с сервисами, парсить XML, использовать PDO. В книге «Путь Rails» нашёл хорошее описание маршрутизации. В «Философия Java» подробно изложены принципы ООП, а также много полезного материала об использовании замыканий, итераторов, коллекций и т.п.. В «ActionScript 3.0» Колина Мука хорошо рассказано, например, об обработке исключений, событиях. Книги «Чистый код» Роберта Мартина и «Совершенный код» Макконела избавили от плохого кода и научили рефакторить. Пара книг по MySQL и теории баз данных помогли разобраться с нормализацией, связями, оптимизацией, ленивой и жадной загрузкой. В «Паттерны проектирования» Фрименов много классных примеров удачного рефакторинга, что облегчило восприятие книги «Паттерны ОО проектирования» банды четырёх, прочитанной до и после неё. Нашёл несколько Yii проектов на GitHub и поковырялся в их коде...

Изучить PHP, Git, базы данных, наследование, композицию, набор известных шаблонов проектирования и приёмов рефакторинга. Изучить классические вещи, из которых состоит программный мир.

Пока продолжу музыкальную тему классным миксом:

И только после изучения всего этого, вернувшись к фреймворкам, вы увидите, что все они, по сути, написаны по схожим принципам и состоят из одних и тех же уже изученных вами вещей: ActiveRecord пришло из Ruby on Rails, контроллеры и модели – это классический подход MVC. И вы их легко приручите и полюбите. Причём все сразу.

Вам будет уже без разницы, на каком из них делать проект и покажутся глупыми все бесполезные войны в комментариях на тему какой фреймворк или какой язык круче. Изменится и ваше отношение к жизни: появится мотивация к ещё большему познанию мира в других сферах и к рефакторингу самой жизни.

Так что если что-то не описано для Yii2 или описано слабо, то спокойно читайте про эти же вещи в документации к другим фреймворкам. И читайте книги и статьи по программированию вообще. Это расширит ваш кругозор и даст понимание многих вещей. Ну и вопросы в комментариях задавайте и на меня через форму в сайдбаре подписывайтесь. Впереди много много знаний и открытий. Желаю вам успехов в их освоении!

UPD: Выложил примерный список книг и нашёл ещё.

Другие статьи

В прошлый раз мы к нашему приложению на basic-шаблоне добавили функционал хранения пользователей в базе данных и добавили формы подтверждения электронного адреса и восстановления пароля. Сегодня мы сделаем последние подготовительные штрихи: доработаем интерфейс, переведём всё с английского языка и добавим кроссбраузерность.

Возникла идея с разрешения собеседника записать и выложить небольшую спонтанную консультацию. Первый блин записи со скайпа вышел комом: голоса друг на друга накладываются и по громкости разные. Кто осилит досмотреть до конца, тот герой :)

Чуть больше месяца назад стартовала предварительная запись на новый мини-спринт по изучению систем контроля версий. Месяц уже начался две недели назад, и у меня есть для Вас несколько хороших новостей. Думал отправить это письмо только записавшимся, но потом решил выложить обращение и здесь, так как личных тайн здесь нет. Итак, поехали!

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

Комментарии

 

Сергей

Добрый вечер, Дмитрий!

Хорошая статья!
Полностью согласен, если нет понимания работы фреймворков в целом или хотя бы Yii1, то Yii2 кажется темным лесом :) на первых порах уж точно))

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

И вообще любую новую тему нужно изучать последовательно - шаг за шагом. Не стоит прыгать из стороны в сторону, пытаясь сразу всё охватить :)

P.S. слежу за статьями на Вашем блоге. Очень полезный ресурс ;)

Ответить

 

des

в общем, статья ни о чем. учите и воздастся... бла-бла-бла. вы не видите общего подхода сегодняшней жизни - нужно ВСЁ и СРАЗУ. не понравилась дока по yii - ушел в дружное сообщество laravel. там показалось неинтересно - подумал\покурил и понял, что лучше родного C# и производного от него ASP.NET смертные еще не придумали. сколько не вижу ответов - сплошной снобизм и якобы элитарность. есть вопрос - так иди читай доку переведенную мартышками и думай почему после А идет С. да, возможно, после определенного этапа ты начинаешь более-менее интуитивно чувствовать что тебе нужно (у меня сейчас так с C# и php+js). так вот отбросьте вы свою якобы элитарность и подсказывайте молодым\неопытным как сделать то или иное. и вот процесс пойдет в гору. я сижу на 7 (СЕМИ!!!!) форумах и ответов по yii фиг найдешь. при этом C# или php имеют миллионную популярность и ответ находится либо в готовых доках (хорошо написанных) либо дружеским советом на форуме. вы не заметили что активность yiiframework.ru 1,5 землекопа, а php.su али php.ru всегда дадут совет. вы веб-гуру, не становитесь закрытой кастой, остеивающей чужаков и новичков, это путь в никуда. наоборот, технологию нужно популизировать. тот же Алан Маск отдал технологию электрозаправок (а сколько он потратил денег чтобы их изобрести?). не будьте снобами. пишите доходчиво. развивайте комьюнити. вот пример как правильно писать доку http://des1roer.blogspot.ru/2015/02/yii-yii-for-dummies.html . популизируйте продукт. это не исходники ОС, чтобы ими не делились. свободный продукт - это в первую очередь комьюнити. задумайтесь над этим

Ответить

 

Даниил

Согласен, любой фреймворк не для школоты, которая хочет всего и сразу, но учиться не хочет. Недавно искал приемника на свой место, послушал человек 20 и ужаснулся ;-( Какой рефакторинг, какие паттерны, люди элементарных вещей не знают и знать не хотят.

Ответить

 

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

На сегодняшний день накопил 893 ответа на yiiframework.ru, 1689 комментариев здесь, 102 вопроса в обратную связь и примерно столько же писем на электронную почту. Так что я, наверное, весьма открыт :)

И насчёт доходчивости материала. Не могли бы Вы мне помочь? Напишите мне в обратную связь, какую из моих статей по вашему мнению нужно дополнить и я с удовольствием это сделаю.

Ответить

 

Эдуард

Слишком большая получилась статья про перенос пользователей в БД. Мне не нужна половина вьюх, работа с почтой и т.д. Просто хочу в базе хранить имя пользователя и его пароль. Не могли бы вы пример записи в бд написать, какой там хеш для какого пароля будет. Проще ручками внести в базу пользователя, однако не могу разобаться, как правильно заполнить все поняли и по какому принципу в юи генерятся все эти хеши, соли и т.д.

Ответить

 

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

Хэш пароля генерируется и проверяется встроенным компонентом Security:

public function setPassword($password)
{
    $this->password_hash = Yii::$app->security->generatePasswordHash($password);
}

public function validatePassword($password)
{
    return Yii::$app->security->validatePassword($password, $this->password_hash);
}

public function generateAuthKey()
{
    $this->auth_key = Yii::$app->security->generateRandomString();
}
 
public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        if ($insert) {
            $this->generateAuthKey();
        }
        return true;
    }
    return false;
}
Ответить

 

Эдуард

Я же написал что это то понятно. Но какой конкретно будет хеш для 123456. Для md5 я могу открыть в мускуле написать md5(123456), а теперь как мне пользователя добавить, не через web а ручками

Ответить

 

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

Используется PHP-функция crypt. Так что прямо в базе не получится. Можете использовать консольную команду из той статьи про перенос.

Ответить

 

Вадим

На MySQL:

UPDATE `user` SET password=MD5('123456') WHERE id=1

или

INSERT `user` (`login`, `password`) values ('admin', MD5('123456'))
Ответить

 

Эдуард

Вадим вообще то в этом и проблема, что в yii не md5 используется, а другой солёный алгоритм.
Дмитрий, когда будет продолжение серии статей про юи?

Ответить

 

Andrey

Приветствую, Дмитрий! Давно не комментировал ничего и не спрашивал. А вопрос всё же есть: пока задача не решена, я всеми силами стараюсь её решить длительное время. И вот думаю, может ли быть полезнее остановиться, если продуктивность сильно упала, чем искать дальше решение? И какой перерыв может быть наиболее оптимальным (среднестатистически) ? Может, даже есть какое-то занятие, способствующее более быстрому восстановлению? Спасибо.

Ответить

 

Юлия

У меня тоже так бывает. Особенно, когда очень сложные задачи попадаются. Мне помогает полное отвлечение от проблемы на два-четыре часа и прогулка на свежем воздухе. Если не помогло, то можно попробовать взяться за её решение на следующий день.

Правда, когда отвлекаешься больше чем на 24 часа, пропадает всякое желание решать эту задачу, да и какую-либо вообще. Сильно сказывается на работе.

Ответить

 

Аноним

Кошмар, Дмитрий, Вас самого не тошнит от изображений из фотобанка в постах? Для кого они? Такое ощущение, что зашёл на автоматически сгенерированный сайт с купленным из бирж текста контентом. :(

Ответить

 

Andrey

Вы один из тех, кто только пряча лицо может изливать на других грязь, накопившуюся внутри. Чем ещё можете похвастаться? Дмитрий - один из немногих, кто старается помочь всем желающим совершенствоваться. А причина вашей озлобленности только в вас, так что начните с исправления себя и мир вокруг вас станет лучше.

Ответить

 

Он

Это не "озлобленность и грязь", это - критика.
Блог неплох, но картинки из фотобанка - просто п****ц.

Ответить

 

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

:)

Ответить

 

Lena

Спасибо, очень много нового узнала об yii2 из Вашей статьи.
А видеоролики великолепно помогают понять сложные части материала.
С удовольствием читаю Ваш блог!
Пожалуйста, продолжайте в том же духе!

Ответить

 

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

Свои видеоролики уже сочиняю. Так что и здесь будут.

Ответить

 

Эдуард

Дмитрий, что там с продолжениями к статье про yii? А то материала совсем мало на русском

Ответить

 

Andrey

Приветствую, Дмитрий! Рассматриваю yii2, так что вопрос по теме.
При двойном клике сообщение добавляется дважды. Просто не успевает срабатывать проверка поиска соответствия по базе.
Можно, конечно, усложнить запрос к базе, но может, есть в yii2 готовое решение от дублирующихся запросов? Спасибо заранее!

Ответить

 

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

Это с Pjax?

Ответить

 

Andrey

Нет. Суть в том, что есть форма, для ввода данных в таблицу, в модели собственный пользовательский фильтр, который при помощи SQL запроса проверяет, нет ли уже в таблице такого региона. Если следующий запрос отправить через секунду, то фильтр срабатывает, а если через долю секунды, то не успевает. По всей видимости, на локалке медленно работает sql. Но мне интересно, на сервере то же самое будет. Чтобы было понятно, приведу два участка кода. Знаю, что они мягко говоря неидеальны. :)

Вот фильтр:

//Проверяет, существует ли регион
public function ifRegionExist($attribute, $params)
{
  if (strcasecmp($this->region, $this->RegionName()) === 0)
  {
     $this->addError($attribute, 'Регион '.$this->region.' уже добавлен!');
  }
}

Вот метод, с которым он работает:

//Функция проверяет наличие в базе заданного региона
public function RegionName()
{
  $db = new \yii\db\Connection(Yii::$app->db);

  $command = $db->createCommand('SELECT * FROM region WHERE region_name=:region_name');
  $command->bindValue(':region_name', $this->region);
  $region = $command->queryOne();
		
  return $region['region_name'];
}

Буду благодарен, если укажете и на другие ошибки. Код явно не оптимален и много лишних строк. =)

Ответить

 

Andrey

Вопрос решён

Ответить

 

Лок

Здравствуйте, Дмитрий!
На иллюстрашке к этой заметке у девушки, похоже, усы. Я чёт приуныл от этого.

Ответить

 

Andrey

Вот я дошёл и до pjax. Проблема такая, что при клике по ссылке меняется не только содержание блока, но и адрес в строке браузера, и если после этого обновить страницу, то переходишь по тому адресу, с которым связывается pjax. Надеюсь, корректно объяснил. Виджеты не использую, просто хочу поменять содержание блока при клике на динамически обновлённое. И всё бы ничего, но вдруг кто-то из посетителей обновит страницу. Спасибо!

Ответить

 

Andrey

Решение нашёл. Как всегда, всё просто. Заметил, что многие бьются над ответом, так что не удаляйте, пожалуйста, для них:

<?php Pjax::begin(['id' => 'mypjax', 'enablePushState'=>false]); ?>
Ответить

 

Николай

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

но блин достало

заходишь на какойто метод или функцию и там

(someText, params)

что передавать в someText понятно, но б**** - что за params, какие params туда можно пихать, какие нельзя, какие значения у них есть... и чтобы вместо того быстро прочесть мануал и побежать дальше - ищешь на 100500 форумах кто какие параметры нарыл и что они делают... тратишь кучу времени...

злой)

Ответить

 

IVan

Вы господа "программисты" говорите про красивые вещи, одни гуляют и дышат свежим воздухом, другие, говорят о том как они проходили всем известный путь создания своего фреймворка и.т.п. Но никто из вас никогда не говорит о самом важном... Что скил программиста зависит не от количества прочитанных книг, а от количества обдуманно написанных строк кода. Можно бесконечно читать книги по разным языкам, но без умения мыслить вы их не поймете, а без практики не сможете использовать в жизни! Под понятием мыслить - я напоминаю что программист это не просто человек который пишет код, это тот кто создает алгоритмы - которые в свою очередь должны быть красивыми т.е максимально простыми, короткими (про такой сахар как учет всевозможных нюансов речь не доходит, мы тупо однобоко решаем задачку =).

Дорогой Дмитрий - прошу вас, напишите об этом, потому как никто (кроме вас конечно, эту тему не поднимает + des который обобщенно описал проблематику - она конечно лежит во многом, а не только комьюнити, но речь идет не об этом...) не дает коротких и понятных ответов тем кому это адресовано.
Я вообще заметил, что большинство не любит говорить про ту сторону медали. Такая популярная тема как человеко-часы, упоминается только когда вопрос денежный... А ведь на практику тоже время нужно - и оно вам не оплачивается, привыкли "чтоб зарплата была 100+, но не сложно и побыстрее" =). Так к слову, интернет он такой же реальный, здесь тоже нужно либо уметь красиво вертеться либо много пахать!

Отдельное спасибо elisdn за этот чудесный оазис, где еще можно и высказаться )

Ответить

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

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


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



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