YII 2, старт для новачка

Крок 1. Вступ.

Короткі визначення та пояснення перед тим, як йти далі:

1) Composer.Ця програма обробить складений нами composer.json, створить папку vendor і закачає туди через Git останню версію YII2 та всі інші «пакети», від яких залежить фреймворк. Детальніше. Відразу попереджу, у Windows можна зіткнутися з купою проблем при встановленні.

2) PSR-4.Розробники постійно холіварят, скільки прогалин має бути таб, як називати змінні і т.д. Зараз тренд такий, що таб - це 4ре пробіли, а як стандарт зберігання та завантаження класів використовується PSR-4. Саме у стандарті PSR-4 Компосер компонує завантажені файли:

Після обробки composer.json, YII2 лежить у

Туди потрапляє вміст папки framework з Гітхаба YII2.

Загалом, хто не в темі, раджу почитати про PSR. Якщо ви поганий хлопець, можна називати свій_методи_ось_так, але будьте готові, що незабаром все це неприємно запахне, вам доведеться підкоритися YII і народити метод getYour_method - пекло перфекціоніста.

3) Namespace. Простір імен були введені в PHP 5.3. Для розуміння всієї кухні відкрийте vendor/yiisoft/yii2/classes.php. Тут перераховані класи, що підвантажуються YII2. Головний клас для веб-застосунків знаходиться в web/application.php. Як бачимо, його неймспейс - yiiweb. Що це означає? Та поки нічого, просто цей клас можна викликати так:

$application = новий yiiwebApplication;

А якщо потім у системі з'явиться інший class Application, його ми викличемо через його унікальний неймспейс, ось так:

$application2 = новий vasyamegasoftApplication;

До PHP 5.3 в одному додатку не можна було використовувати два класи з однаковою назвою.

Усі класи classes.php розділені за неймспейсамиyii****, це створює абстрактну структуру фреймворку. Наш додаток ми точно також розкидаємо власними неймспейсами і YII зможе по них орієнтуватися в нашій структурі.

4) MVC. Нічого краще за схему MVC (модель-вид-контролер) поки не було винайдено, майже всі популярні фреймворки працюють за цією схемою. Це означає, що будь-який запит користувача проходить через (обов'язково) Контролер та (можливо) Модель та (можливо) В'ю. Це дуже зручно, практично і красиво, дотримання цього ланцюжка дозволить проекту триматися в зібраному стані - нічого ні від куди не стирчатиме (з жахом згадайте ваш перший проект не на MVC).

Ось три класи YII2, що розширюють класи контролера і моделі, а також файли шаблону:

5) CRUD. Create, Read, Update, Delete. Майже всі веб-програми побудовані на цих чотирьох літерах. Ми створюємо, читаємо, оновлюємо, видаляємо дані у базі даних.

Крок 2. Встановлення.

У корені проекту створимо composer.json із заповненою секцією require:

Коли вийде стабільна версія YII2, у першому рядку (minimum-stability) потреба відпаде. Тепер передамо цей файл компосера. У Linux треба у папці з проектом виконати composer install. У Windows раджу при установці вибрати галочку "впровадитися в провідник" і встановлювати пакети через праву кнопку миші (ПКМ по папці composer.json).

Якщо все ОК, створиться папка vendor, в яку буде поміщений YII2 і всі пакети. У папці також лежатиме autoload.php, який завантажить усі потрібні класи.

Надалі нам знадобляться ще деякі пакети — наприклад, дебагова панель та генератор коду. Відразу додамо все перераховане у require:

І здійснимо оновлення: composer update.

Після навчання ми будемо клепатисайти на основі готових каркасів. Див, як встановити базовий або розширений каркас YII2 сайту через Компосер, разом із самим YII.

Крок 3. Конфігурація.

Наступний крок після встановлення – конфігурація. Наше майбутнє додаток буде максимально схожим на CodeIgniter за структурою. Але взагалі, в YII2 можна (але краще не треба) каламутити з папками та неймспейсами що завгодно.

Створюємо папку application і в ній стандартний набір інших папок: config, controllers, models, views, components, runtime (сюди YII записуватиме системні логи).

index.php виглядає так, він просто отримує конфіг і передає його в yiiwebApplication:

Ось на цьому етапі важливо розуміти, що ми взагалі робимо. yiiwebApplication - це звичайний клас, як і все інше в YII. Кожен клас добре документований. Наприклад, ось документація на цей, в ній описано кожну властивість та метод. Після зміни якості будуть заповнені необхідними нам даними. Про "добре описано" - я злукавив, насправді "скоро буде добре описано", в даний момент YII2 у стадії бети і в документації купа неточностей.

Мінімальний application/config/config.php для програми, що працює з базою:

Цей конфіг завантажить один компонент - клас роботи з БД. І, якщо в index.php продефайнена константа розробки, пару модулів для всімашановного розробника.

Тепер перевіримо, чи все працює. Створюємо докорінно проекту папку assets з «гіршими» правами, викликаємо модуль генератора коду site.lc/?r=gii. Принагідно цінуємо дебаговую панель знизу. Казка.

Після прочитання статті, домашнім завданням буде згенерувати модель на основі своєї таблиці в БД, а також додаток CRUD.

Крок 4. Контролер.

Контролер - клас, що містить екшени, що обробляють запитикористувача. Кожен екшен – це якась кнопка на спільній панелі. Натискаємо на кнопку – отримуємо результат.

Контролер за умовчанням в YII2 - SiteController, він повинен лежати в неймспейсі appcontrollers (неймспейс можна змінити, задавши в конфізі ключ controllerNamespace). Екшен за замовчуванням – Index. Створюємо application/controllers/SiteController.php. Пам'ятаєте про PSR? Так ось, класи рекомендується називати з великої літери, як і файли, які містять клас. А методи – з маленької літери.

Тут все інтуїтивно зрозуміло. Побачимо хелло ворлд, викликавши головну сторінку сайту. Кому все ще незрозуміло, навіщо потрібний контролер взагалі, той може створити ще один екшн:

І викликати у браузері /?r=site/vasya. Мати божа, та YII по _GET[r] визначив, що запитується саме метод actionVasya класу SiteController. Далі в методах контролера ми будемо прописувати всі умови if-else, отримувати всі дані з бази через модель передачі результату обробки запиту користувача шаблон (в'ю).

Читайте докладніше про клас класу yiiwebController, функціонал якого запозичує наш клас контролера.

Майже всі наші програми в бекенді будуть містити в своєму контролері CRUD методи: actionRead, actionUpdate, actionDelete, actionCreate, кожен займатиметься своїми справами, але всі вони будуть використовувати спільну модель. Опис цих екшенів я випущу в цій статті. Розібратися, як працює кожен, ви зможете на прикладі готового коду, згенерованого домашньому завданні.

Крок 4. Модель.

Модель у YII — найголовніша річ, саме через модель взаємодіють усі частини системи, модель тримає додаток у зібраному стані. Модель YII2 майже завжди прив'язана до бази даних. Є таблиця і є модель, що її описує.

Тут я дозволю собівідступ від YII. Перш ніж використовувати модель YII, треба розуміти, що таке модель в програмуванні взагалі. З точки зору ОВП все у світі є об'єктом — річка, людина, пісок, комп'ютер. Краще, якщо людина також складається з об'єктів — ніздря, пальці ніг і т.д. Ну та не заходитимемо надто далеко, повернемося до моделі. Ми створюватимемо додаток з управління клієнтами аудиторської фірми, основний об'єкт — товариство з обмеженою відповідальністю (відповідальність можна обмежувати через private методи, але так далеко ми заходити не будемо). Навколо ТОВ крутяться всі пироги фірми, це її основа, тому можна дійти невтішного висновку, що найголовніше, що у веб-додатку фірми — це модель ТОВ. Давайте створимо цю модель на основі класу PHP.

Все, далі ми можемо підвантажити нашу модель у контролері (use appmodels), створити скільки завгодно екземплярів з різними іменами та засновниками, як завгодно крутити-крутити цими ТОВ у контролері та в'юхах.

Тут треба пам'ятати, що ТОВ — це інформація, а й різні дії. Наприклад, злиття. Ми можемо створити в моделі метод merge, який робитиме потрібні маніпуляції, і передаватиме туди об'єкт для злиття.

За допомогою моделей можна описати все життя. Чим нам у цьому допоможе YII2? Насамперед клас yiidbActiveRecord (раджу уважно вивчити), там купа всього, що допоможе пов'язати нашу модель даних з таблицями MySQL. Наслідуємо його і використовуємо.

До речі, важливо розуміти, що АктивРекорд тягне за собою успадкування yiibaseModel, вивчивши цей клас, ви зрозумієте, що є моделлю в YII. Це правила валідації надісланих користувачем даних, це «атрибути», це «поведінка», це магічні сеттери та гетери, які взаємодіють із створеним вами класом моделі.

В базіданих буде три таблиці:

Основна - ooo. У фундаторах будуть зберігатися засновники. founders_to_ooo - сполучна таблиця, що прив'язує скільки завгодно засновників до одного запису в таблиці ooo.

Для засновників ми створюємо окрему модель Founder.

Далі, в контролері додаємо use appmodelsOOO; та виводимо інфу про ТОВ з >

А ось так можна (потрібно) використовувати метод yiibasemodelload() у комбінації з yiidbActiveRecordsave() для завантаження даних у модель та збереження даних у БД:

YII в load перевірить всю валідацію, описану в rules моделі, і тільки якщо дані коректні, виконає save(), якщо дані некоректні - у в'юсі буде виведена потрібна помилка поряд з полем. Зрозуміло, якщо ми вставляємо дані в базу через API YII, ми убезпечимо себе від будь-яких ін'єкцій. Нот бід.

Це шаблон сайту. Контролер повертає результат рендерингу шаблону з переданими змінними ($this->render('index', ['model' => $model]);) і цей результат виводиться у браузер. У YII2 шаблон поділяється на два типи: шар та в'ю. Шари зберігаються в views / layouts, в'ю - в views /. Створюємо папки /application/views/layouts/ та /application/views/site/

Створюємо шар main.php (це шар за замовчуванням). Приблизно виглядає шар YII2.

Для чого всі ці endBody() ?> замість звичайного тега? Щоб фреймворк міг проводити поведінку цієї частини сторінки при рендерингу, туди він підставлятиме свої скрипти тощо.

Хелпер html буде використаний майже у всіх завірюхах, вивчіть документацію по ньому.

Найрозумніші вже здогадалися, у $content шару YII поверне завірюху, яку визначить за назвою екшену. Створюємо application/views/site/index.php

$model передається в'ю через екшен контролера.

Крок 6. Віджети.

Основна мета фреймворку -прискорити процес створення проекту. Чим менше коду, тим краще. А краще за короткий код може бути тільки вже існуючий код. Віджет – вже існуючий код. Приклад такого віджету - GridView, який виведе таблицю даних із можливістю сортувати по кожній колонці.

Видозмінюємо нашу в'ю:

Усі, дивимося результат? Хотілося б, але ні, нам не вистачає $searchModel та $dataProvider. Перша змінна - окрема модель ТОВ, яка здійснює пошук. Друга змінна - ця наша стара $model, результат вибірки, але дещо ускладнений. Все важче, ніж хотілося б. Але на цьому прикладі ви побачите, як через модель відбувається спілкування між незалежними частинами YII.

Створюємо модель OOOSearch

Ось тепер отримуємо результат – табличку з пагінацією та можливістю фільтрувати та сортувати вміст. Побічний ефект від копіювання і припасування під себе готового коду - це досить нудне заняття. Благо, є генератор коду CRUD (/?r=gii), за допомогою нього ми можемо (не завжди *троллфейс*) згенерувати і пошукову модель, і завірюху з цим віджетом.

Окремо варто залишитись на віджеті yiiwidgetsActiveForm. За допомогою нього створюються усі форми на сайті. Цей віджет вміє виводити основні елементи форми та візьме на себе функцію валідації даних перед відправкою на сервер. Загалом він вкрай простий. Виводимо форму та один інпут, передаємо інпуту модель з rules, щоб віджет знав, що має бути введене у кожне поле:

Повторюся, в ідеалі всю цю гидоту ми не писатимемо, треба тільки освоїти генератор коду, і завірюха буде згенерована на основі зазначеної таблиці.

Крок 8. Поводження та події.

Тут я процитую пропозицію цієї статті.

У ІІІ існує така річ як поведінки (behaviors).

Як і все інше вYII2, поведінка є класом. Створюємо клас applicationcomponentsLog.php в неймспейсі appcomponents

Готово! Тепер наш контролер логується, цю поведінку ми можемо використовувати у всіх наступних сайтах. Приклад дещо простий, більш бойовий приклад у тій же статті, тепер вона має стати зрозумілішою вам. Правда, там «велосипед», зараз у YII є вбудована поведінка yiibehaviorsSluggableBehavior, що використовує yiibehaviorsAttributeBehavior (не знаю тільки, чи підтримується кирилиця, не перевіряв).

Крок 8. Модулі.

Як кажуть, у хорошому ООП коді немає проблем, які не можна було б вирішити запровадженням нового рівня абстракції. Окрім однієї — надто великий рівень абстракції. Модуль — додатковий рівень абстракції у програмі. Модуль – це пачка. Пачка MVC, що містить свої контролери, моделі та в'юхи, відгороджені від інших контролерів, моделей та в'юх. Якийсь програміст колись захотів додати новий розділ на сайт, подивився на смітник вже створених контролерів і пообіцяв, що створить свої контролери з блекджеком та повіями. Ну і додав підтримку модулів у YII.

Модулі програми перераховуються у конфігурації:

Саме «модуль» є генератором коду gii, який ми підключили спочатку. Щоб зрозуміти, що до чого, відкриваємо vendor/yiisoft/yii2, бачимо клас модуля Module.php, папку controllers та views. Можна здогадатися, що за тим самим принципом ми змогли б створити свій модуль ТОВ та використовувати його на будь-якому сайті через виклик /?r=ooo

Читаємо цю статтю. Там вся програма побудована на модулях. Воно складне, я сам зараз копаюсь там.

Крок 10. Післямова.

Тут лише хочу описати свої відчуття від YII2 під час першого знайомства. До цього я пиляв сайти на CodeIgniter і зробив свої тулзи длягенерації коду для автоматичної валідації форм і т.д. Зараз я бачу все це в YII2, але тут це реалізовано справді круто та універсально. Ось і всі почуття. Далі вивчатиму YII, залишилося ще купа всього цікавого.