Browse Source

docs/*uk Update Ukrainian translation [skip ci]

tags/2.0.6
Vadym Chenin 9 years ago
parent
commit
f9bdcb7a51
  1. 8
      docs/guide-uk/README.md
  2. 2
      docs/guide-uk/concept-autoloading.md
  3. 4
      docs/guide-uk/intro-upgrade-from-v1.md
  4. 2
      docs/guide-uk/intro-yii.md
  5. 2
      docs/guide-uk/start-installation.md
  6. 12
      docs/guide-uk/start-workflow.md
  7. 2
      docs/guide-uk/structure-application-components.md
  8. 2
      docs/guide-uk/structure-applications.md
  9. 190
      docs/guide-uk/structure-controllers.md
  10. 511
      docs/guide-uk/structure-models.md
  11. 4
      docs/guide-uk/tutorial-yii-integration.md
  12. 10
      docs/internals-uk/translation-workflow.md

8
docs/guide-uk/README.md

@ -19,7 +19,7 @@ All Rights Reserved.
----------------
* [Встановлення Yii](start-installation.md)
* [Запуск додатків](start-workflow.md)
* [Виконання додатків](start-workflow.md)
* [Говоримо "Привіт"](start-hello.md)
* [Робота з формами](start-forms.md)
* [Робота з базами даних](start-databases.md)
@ -35,7 +35,7 @@ All Rights Reserved.
* [Додатки](structure-applications.md)
* [Компоненти додатка](structure-application-components.md)
* [Контролери](structure-controllers.md)
* **TBD** [Моделі](structure-models.md)
* [Моделі](structure-models.md)
* **TBD** [Представлення](structure-views.md)
* **TBD** [Модулі](structure-modules.md)
* **TBD** [Фільтри](structure-filters.md)
@ -126,7 +126,7 @@ All Rights Reserved.
* **TBD** [HTTP кешування](caching-http.md)
RESTful веб-сервіси
Веб-сервіси RESTful
-------------------
* **TBD** [Швидкий старт](rest-quick-start.md)
@ -167,7 +167,7 @@ RESTful веб-сервіси
* **TBD** [Консольні команди](tutorial-console.md)
* **TBD** [Основні валідатори](tutorial-core-validators.md)
* **TBD** [Інтернаціоналізація](tutorial-i18n.md)
* **TBD** [Відправлення пошти](tutorial-mailing.md)
* **TBD** [Робота з поштою](tutorial-mailing.md)
* **TBD** [Вдосконалення продуктивності](tutorial-performance-tuning.md)
* **TBD** [Робота на віртуальному хостингу](tutorial-shared-hosting.md)
* **TBD** [Шаблонізатори](tutorial-template-engines.md)

2
docs/guide-uk/concept-autoloading.md

@ -53,7 +53,7 @@ Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
```
Для вказівки шляхів до файлів класів можна використовувати [псевдоніми](concept-aliases.md). Мапу класів необхідно сформувати
в процесі [первинного завантаження](runtime-bootstrapping.md), так як вона повинна бути сформована до використання класів.
в процесі [початкового завантаження](runtime-bootstrapping.md), бо вона повинна бути сформована до використання класів.
Використання інших автозавантажувачів <span id="using-other-autoloaders"></span>

4
docs/guide-uk/intro-upgrade-from-v1.md

@ -1,7 +1,7 @@
Оновлення із версії 1.1
=======================
Між версіями 1.1 і 2.0 існує багато відмінностей, так як Yii був повністю переписаний для версії 2.0.
Між версіями 1.1 і 2.0 існує багато відмінностей, оскільки Yii був повністю переписаний для версії 2.0.
Таким чином, оновлення з версії 1.1 не є таким же тривіальним, як оновлення між мінорними версіями.
У цьому посібнику з оновлення наведено основні відмінності між двома версіями.
@ -159,7 +159,7 @@ Yii 2.0 розширює спосіб використання псевдоні
у шаблоні проектування Модель-Представления-Контролер (MVC). Якщо ви хочете отримати доступ до контролера або віджету, то використовуйте вираз `$this->context`.
Для формування часткових представлень тепер використовується метод `$this->render()`, а не `$this->renderPartial()`.
Результат виклику методу `render` тепер повинен бути виведений безпосередньо, так як `render` повертає результат,
Результат виклику методу `render` тепер повинен бути виведений безпосередньо, тому, що `render` повертає результат,
а не відображає його одразу. Наприклад,
```php

2
docs/guide-uk/intro-yii.md

@ -51,6 +51,6 @@ Yii — не проект однієї людини. Він підтримуєт
Yii 2.0 потребує PHP 5.4.0 та вище. Щоб дізнатися вимоги для окремих можливостей ви можете запустити скрипт перевірки вимог,
який поставляється із кожним релізом фреймворку.
Для розробки на Yii необхідне загальне розуміння ООП, так як фреймворк повністю слідує цій парадигмі.
Для розробки на Yii необхідне загальне розуміння ООП, оскільки фреймворк повністю слідує цій парадигмі.
Також слід вивчити такі сучасні можливості PHP як [простори імен](http://www.php.net/manual/en/language.namespaces.php)
і [трейти](http://www.php.net/manual/en/language.oop5.traits.php).

2
docs/guide-uk/start-installation.md

@ -5,7 +5,7 @@
Перший варіант є бажанішим, тому що дозволяє встановлювати нові [розширення](structure-extensions.md) або оновлювати Yii простим виконанням однієї команди.
Після стандартного встановлення Yii ми отримуємо як фреймворк, так і шаблон проекту. Шаблон проекту - це робочий проект Yii,
в якому реалізовано деякий базовий функціонал, такий як система входу/виходу користувачів, форма зворотнього зв’язку і т.д.
в якому реалізовано деякий базовий функціонал, такий як система входу/виходу користувачів, форма зворотнього зв’язку і т. д.
Його код організовано в рекомендований спосіб. Таким чином, це може слугувати гарною відправною точкою для ваших проектів.
У цьому та у наступних кількох розділах буде описано, як встановити Yii з так званим *Базовим шаблоном проекту* та

12
docs/guide-uk/start-workflow.md

@ -1,5 +1,5 @@
Запуск додатків
===============
Виконання додатків
==================
Після встановлення Yii, базовий додаток буде доступний або по URL `http://hostname/basic/web/index.php`,
або по `http://hostname/index.php`, в залежності від налаштування веб-сервера. Даний розділ - загальне введення в
@ -26,7 +26,7 @@
допомогою якого здійснюється навігація по сайту.
У нижній частині вікна ви зможете бачити системні повідомлення Yii - налагоджувальну інформацію,
повідомлення про помилки, запити до бази даних і т.п. Відображенням даної інформацію керує
повідомлення про помилки, запити до бази даних і т. п. Відображенням даної інформацію керує
[вбудований відладчик](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-uk/README.md), він записує і відображає інформацію про хід виконання додатку.
Крім веб-додатка, існує консольний скрипт `yii`, що розташований в базовій директорії додатка.
@ -48,7 +48,7 @@ basic/ базова директорія додатка
commands/ містить класи консольних команд
controllers/ містить класи контролерів
models/ містить класи моделей
runtime/ містить файли, які генерує Yii під час виконання додатку (журнали, кеш і т.п.)
runtime/ містить файли, які генерує Yii під час виконання додатку (журнали, кеш і т. п.)
vendor/ містить пакунки Composer'а і, власне, сам фреймворк Yii
views/ містить представлення додатку
web/ базова веб-директорія, містить файли, доступні через Web
@ -58,7 +58,7 @@ basic/ базова директорія додатка
```
В цілому, додаток Yii можна розділити на дві категорії файлів: розміщенні в `basic/web` і розміщенні в інших директоріях.
Перша категорія доступна через HTTP (наприклад, браузером), друга недоступна зовні, та і не повинна бути, так як містить службову інформацію.
Перша категорія доступна через HTTP (наприклад, браузером), друга недоступна зовні, та і не повинна бути, оскільки містить службову інформацію.
В Yii реалізований шаблон проектування [модель-представлення-контролер (MVC)](http://uk.wikipedia.org/wiki/Model-View-Controller),
що відображається на вищезазначеній структурі директорій додатка. В директорії `models` знаходяться всі класи [моделей](structure-models.md),
@ -92,6 +92,6 @@ basic/ базова директорія додатка
6. Якщо хоч один фільтр поверне помилку - виконання додатку зупиняється.
7. Якщо всі фільтри пройдені - додаток виконується.
8. Дія завантажує модель даних, скоріше за все із бази даних.
9. Дія формує представлення та відображає в ньому дані (в т.ч. і отримані із моделі).
9. Дія формує представлення та відображає в ньому дані (в т. ч. і отримані із моделі).
10. Сформований результат передається компоненту [відповіді](runtime-responses.md) додатка.
11. Компонент "відповіді" відправляє готовий результат роботи додатка браузеру користувача.

2
docs/guide-uk/structure-application-components.md

@ -102,7 +102,7 @@
* [[yii\log\Dispatcher|log]]: керує призначенням журналу.
Більш детальна інформація наведена у розділі [Журналювання](runtime-logging.md).
* [[yii\swiftmailer\Mailer|mail]]: надає можливості для побудови і відправлення поштових повідомлень.
Більш детальна інформація наведена у розділі [Відправлення пошти](tutorial-mailing.md).
Більш детальна інформація наведена у розділі [Робота з поштою](tutorial-mailing.md).
* [[yii\base\Application::response|response]]: являє собою об’єкт відповіді сервера кінцевим користувачам.
Більш детальна інформація наведена у розділі [Відповіді](runtime-responses.md).
* [[yii\base\Application::request|request]]: являє собою об’єкт запиту, який сервер отримує від кінцевих користувачів.

2
docs/guide-uk/structure-applications.md

@ -375,7 +375,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
### Корисні властивості <span id="useful-properties"></span>
Властивості, які перераховані в даному підрозділі, не є часто змінюваними, так як їх значення за замовчуванням
Властивості, які перераховані в даному підрозділі, не є часто змінюваними, оскільки їх значення за замовчуванням
відповідають загальноприйнятим домовленостям. Однак, ви можете їх налаштувати, якщо вам потрібно використовувати
інші значення.

190
docs/guide-uk/structure-controllers.md

@ -2,10 +2,10 @@
==========
Контролери є частиною архітектури [MVC](http://uk.wikipedia.org/wiki/Модель-вид-контролер). Це об’єкти класів,
успадкованих від [[yii\base\Controller]] та відповідають за обработку запитів і генерацію відповідей.
успадкованих від [[yii\base\Controller]] та відповідають за обробку запитів і генерацію відповідей.
Зокрема, після отримання контролю від [додатків](structure-applications.md), контролери проаналізують
вхідні дані, передадуть їх у [моделі](structure-models.md), додадуть результати моделі у
[представлення](structure-views.md), і в кінцевому підсумку згенерують вихідні відповіді.
[представлення](structure-views.md), і на сам кінець згенерують вихідні відповіді.
## Дії <span id="actions"></span>
@ -13,7 +13,7 @@
Контролери складаються з *дій*, які є основними блоками, до яких може звертатись кінцевий користувач і запитувати
виконання того або іншого функціоналу. В контролері може бути одна або декілька дій.
Наступний приклад показує `post` контролер з двома діями: `view` та `create`:
Наступний приклад показує контролер `post` з двома діями: `view` та `create`:
```php
namespace app\controllers;
@ -53,24 +53,23 @@ class PostController extends Controller
```
У дії `view` (визначеній методом `actionView()`) код спочатку завантажує [модель](structure-models.md),
відповідно запитуваної ID моделі; Якщо модель успішно завантажена, то код відобразить її за допомогою
[представлення](structure-views.md), під назвою `view`. В іншому випадку - буде визване виключення.
відповідно до запитуваного ідентифікатора моделі; Якщо модель успішно завантажена, то код відобразить її за допомогою
[представлення](structure-views.md), під назвою `view`. В іншому випадку - буде отримане виключення.
У дії `create` (визначеній методом `actionCreate()`), код аналогічний. Він спочатку намагається завантажити
У дії `create` (визначеній методом `actionCreate()`) подібний код. Він спочатку намагається завантажити
[модель](structure-models.md) за допомогою даних із запиту і зберегти модель. Якщо все пройшло успішно,
то код перенаправить браузер на дію `view` із ID щойно створеної моделі. В іншому випадку - він відобразить
предаставлення `create`, через яке користувач зможе вказати необхідні дані.
то код перенаправить браузер на дію `view` із ідентифікатором щойно створеної моделі. В іншому випадку - він відобразить
представлення `create`, через яке користувач зможе вказати необхідні дані.
## Маршрути <span id="routes"></span>
Кінцеві користувачі звертаються до дій з допомогою так названих *маршрутів*. Маршрут це рядок,
який складається з наступних частин:
Кінцеві користувачі звертаються до дій з допомогою так названих *маршрутів*. Маршрут це текстовий рядок, який складається з наступних частин:
* ID модуля: він існує, тільки якщо контролер належить не додатку, а [модулю](structure-modules.md);
* ID контролера: рядок, який унікально ідентифікує контролер серед всіх інших контролерів одного і того ж додатка
* ідентифікатор модуля: він існує, тільки якщо контролер належить не додатку, а [модулю](structure-modules.md);
* [ідентифікатор контролера](#controller-ids): текстовий рядок, який унікально ідентифікує контролер серед всіх інших контролерів одного і того ж додатка
(або одного й того ж модуля, якщо контролер належить модулю);
* ID дії: рядок, який унікально ідентифікує дію серед всіх інших дій одного й того ж конторолера.
* [ідентифікатор дії](#action-ids): текстовий рядок, який унікально ідентифікує дію серед всіх інших дій одного й того ж контролера.
Маршрути можуть мати наступний формат:
@ -80,13 +79,13 @@ ControllerID/ActionID
або наступний формат, якщо контролер належить модулю:
```php
```
ModuleID/ControllerID/ActionID
```
Таким чином, якщо користувач звертається до URL `http://hostname/index.php?r=site/index`, то буде викликано дію `index`
у контролері `site`. Розділ [Маршрутизація та створення URL](runtime-routing.md) містить більш детальну інформацію
про те, як маршрути співставляються із діями.
про те, як маршрути співвідносяться із діями.
## Створення контролерів <span id="creating-controllers"></span>
@ -106,32 +105,31 @@ class SiteController extends Controller
```
### ID контролерів <span id="controller-ids"></span>
### Ідентифікатори контролерів <span id="controller-ids"></span>
За звичай контролер зроблений таким чином, що він повинен обробляти запити, які пов’язані з певним ресурсом.
Саме з цієї причини, ID контролерів за завичай є іменниками, які посилаються на ресурс, який вони обробляють.
Наприклад, ви можете використовувати `article` в якості ID контролера, який відповідає за обробку даних публікацій.
Зазвичай контролер зроблений таким чином, що він повинен обробляти запити, які пов’язані з певним ресурсом.
Саме з цієї причини, ідентифікатори контролерів за зазвичай є іменниками, які посилаються на ресурс, який вони обробляють.
Наприклад, ви можете використовувати `article` в якості ідентифікатора контролера, який відповідає за обробку даних статей.
За замовчуванням, ID контролерів мають містити тільки наступні символи: англійські букви в нижньому регістрі, цифри,
підкреслення, тире і слеш. Наприклад, обидва `article` та `post-comment` є прийнятними ID контролерів, в той час,
За замовчуванням, ідентифікатори контролерів мають містити тільки наступні символи: англійські букви в нижньому регістрі, цифри,
підкреслення, тире і слеш. Наприклад, обидва ідентифікатори контролера `article` та `post-comment` є прийнятними, в той час,
як `article?`, `PostComment`, `admin\post` не є такими.
ID контролера також може містити префікс субдиректорії. Наприклад, у `admin/article` - частина `article` відповідає
контролеру в субдиректорії `admin` [[yii\base\Application::controllerNamespace|простору імен контролера]].
Допустимими символами для префіксів субдиректорій є: англійські букви в нижньому і верхньому регістрах, цифри,
символи підкреслення і слеш, де слеш - використовується в якості роздільника для багаторівневих субдиректорій
(наприклад `panels/admin`).
Ідентифікатор контролера також може містити префікс під-директорії. Наприклад, у `admin/article` частина `article` відповідає
контролеру в під-директорії `admin` [[yii\base\Application::controllerNamespace|простору імен контролера]].
Допустимими символами для префіксів під-директорій є: англійські букви в нижньому і верхньому регістрах, цифри, символи підкреслення і
слеш, де слеш використовується в якості роздільника для багаторівневих під-директорій (наприклад, `panels/admin`).
### Іменування класів контролерів <span id="controller-class-naming"></span>
Назви класів контролерів можуть бути отримані із ID контролерів наступними правилами:
Назви класів контролерів можуть бути отримані із ідентифікаторів контролерів наступним чином:
* Привести у верхній регістр перший символ в кожному слові, розділеному дефісами. Зверніть увагу, що, якщо
ID контролера містить слеш, то дане правило поширюється тільки на частину після останнього слеша в ID контролера.
* Прибрати дефіси і замінити будь-який прямий слеш на зворотний.
* Додати суфікс `Controller`.
* Додати на початок [[yii\base\Application::controllerNamespace|простір імен контролера]].
1. Привести у верхній регістр перший символ в кожному слові, розділеному дефісами. Зверніть увагу, що, якщо ідентифікатор
контролера містить слеш, то дане правило поширюється тільки на частину після останнього слеша в ідентифікаторі контролера.
2. Прибрати дефіси і замінити будь-який прямий слеш на зворотний.
3. Додати суфікс `Controller`.
4. Додати на початок [[yii\base\Application::controllerNamespace|простір імен контролера]].
Нижче наведено декілька прикладів, з урахуванням того, що
[[yii\base\Application::controllerNamespace|простір імен контролера]] має значення за замовчуванням `app\controllers`:
@ -141,12 +139,12 @@ ID контролера також може містити префікс суб
* `admin/post-comment` відповідає `app\controllers\admin\PostCommentController`;
* `adminPanels/post-comment` відповідає `app\controllers\adminPanels\PostCommentController`.
Класи контролерів мають бути [автозавантаженими](concept-autoloading.md). Саме з цієї причини у вищенаведених прикладах
Класи контролерів мають бути [автоматично завантаженими](concept-autoloading.md). Саме з цієї причини у вищенаведених прикладах
контролер `article` має бути збереженим у файл, [псевдонім шляху](concept-aliases.md) якого є
`@app/controllers/ArticleController.php`; в той час, як контролер `admin/post2-comment` має знаходитись у файлі
`@app/controllers/admin/Post2CommentController.php`.
> Інформація: Останній приклад `admin/post2-comment` показує яким чином ви можете розташувати контролер в директорії
> Інформація: Останній приклад `admin/post2-comment` показує яким чином ви можете розташувати контролер в під-директорії
[[yii\base\Application::controllerNamespace|простору імен контролера]]. Це дуже зручно, коли ви хочете організувати
свої контролери у декілька категорій і не хочете використовувати [модулі](structure-modules.md).
@ -154,7 +152,7 @@ ID контролера також може містити префікс суб
### Мапа контролерів <span id="controller-map"></span>
Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] для того, щоб подолати
описані вище обмеження іменування ID контролерів і назв класів. В основному, це дуже зручно, коли ви використовуєте
описані вище обмеження іменування ідентифікаторів контролерів і назв класів. В основному, це дуже зручно, коли ви використовуєте
сторонні контролери, іменування яких ви не можете контролювати.
Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] в
@ -178,13 +176,12 @@ ID контролера також може містити префікс суб
### Контролер за замовчуванням <span id="default-controller"></span>
Кожний додаток має контролер за замовчуванням, вказаний через властивість [[yii\base\Application::defaultRoute]].
Коли в запиті не вказано [маршрут](#routes), то буде використано маршрут із даної властивості.
Для [[yii\web\Application|веб-додатків]], це значення рівне `'site'`, у той час, як для
[[yii\console\Application|консольних додатків]], це `'help'`. Таким чином, якщо вказаний URL
Коли в запиті не вказано [маршрут](#routes), то буде використано маршрут із зазначеної властивості.
Для [[yii\web\Application|веб-додатків]] це значення рівне `'site'`, у той час, як для
[[yii\console\Application|консольних додатків]], це - `'help'`. Таким чином, якщо вказаний URL
`http://hostname/index.php`, це значить, що контролер `site` виконає обробку запиту.
Ви можете змінити контролер за замовчуванням наступним чином в
[налаштуваннях додатку](structure-applications.md#application-configurations):
Ви можете змінити контролер за замовчуванням наступним чином в [налаштуваннях додатку](structure-applications.md#application-configurations):
```php
[
@ -195,9 +192,9 @@ ID контролера також може містити префікс суб
## Створення дій <span id="creating-actions"></span>
Створення дій може бути таким же простим, як і оголошення так званих *методов дій* у класі контролера.
Метод дії це *public* метод, ім’я якого починається зі слова `action`. Значення методі дії, що повертається, є даними
відповіді, які будуть вислані кінцевому користувачу. Наведений нижче код визначає дві дії - `index` і `hello-world`:
Створення дій може бути настільки ж простим, як і оголошення так званих *методів дій* у класі контролера. Метод дії це
*публічний* метод, ім’я якого починається зі слова `action`. Значення, яке повертається методом дії, представляє дані
відповіді, які будуть відправлені кінцевому користувачу. Наведений нижче код визначає дві дії `index` і `hello-world`:
```php
namespace app\controllers;
@ -219,50 +216,52 @@ class SiteController extends Controller
```
### ID дій <span id="action-ids"></span>
### Ідентифікатори дій <span id="action-ids"></span>
Частіше за все, дія розробляється для певної конкретної обробки ресурса. З цієї причини ID дій, в основному,
є дієсловами, такими як `view`, `update`, і т.д.
Частіше за все, дія розробляється для певної маніпуляції над ресурсом. З цієї причини ідентифікатори дій, в основному,
є дієсловами, такими як `view`, `update`, і т. д.
За замовчуванням, ID дій повинні містити тільки такі символи: англійські букви в нижньому регістрі, цифри,
підкреслення і дефіси. Дефіси в ID дій використовуються для поділу слів. Наприклад, `view`, `update2`,
`comment-post` є допустимими ID дій, в той час, як `view?`, `Update` не є такими.
За замовчуванням, ідентифікатори дій повинні містити тільки такі символи: англійські букви в нижньому регістрі, цифри,
підкреслення і дефіси. (Дефіси можуть використовуються для поділу слів.) Наприклад, `view`, `update2` і
`comment-post` є допустимими ідентифікаторами дій, в той час, як `view?` та `Update` не є такими.
Ви можете створювати дії двома способами: вбудовані дії і окремі дії. Вбудована дія є методом, визначеним
в класі контролера, тоді як окрема дія є екземпляром класу, успадкованого від [[yii\base\Action]] або його нащадків.
Ви можете створювати дії двома способами: вбудовані дії і автономні дії. Вбудована дія є методом, визначеним
в класі контролера, тоді як автономна дія є класом, успадкованим від [[yii\base\Action]] або його нащадків.
Вбудовані дії вимагають менше зусиль для створення і, в основному, використовуються якщо у вас немає потреби
у повторному використанні цих дій. Окремі дії, з іншого боку, в основному створюються для використання в різних
контролерах або при використанні у [розширеннях](structure-extensions.md).
у повторному використанні цих дій. Автономні дії, з іншого боку, в основному створюються для використання в різних
контролерах або для розподілення у вигляді [розширень](structure-extensions.md).
### Вбудовані дії <span id="inline-actions"></span>
Вбудовані дії це ті дії, які визначені у рамках методів контролера, як ми це вже обговорили.
Вбудовані дії це ті дії, які визначені у рамках методів контролера, як це було щойно описано.
Назви методів дій можуть бути отримані із ID дій наступним чином:
Назви методів дій можуть бути отримані із ідентифікаторів дій наступним чином:
* Привести перший символ кожного слова в ID дії у верхній регістр;
* Прибрати дефіси;
* Додати префікс `action`.
1. Привести перший символ кожного слова в ідентифікаторі дії у верхній регістр.
2. Прибрати дефіси.
3. Додати префікс `action`.
Наприклад, `index` перетвориться у `actionIndex`, а `hello-world` перетвориться у `actionHelloWorld`.
> Примітка: Назви імен дій є *регістрозалежними*. Якщо у вас є метод `ActionIndex`, то його не буде враховано
> Примітка: Назви імен методів дій є *регістр-залежними*. Якщо у вас є метод `ActionIndex`, то його не буде враховано
як метод дії, і в результаті, запит до дії `index` призведе до отримання виключення. Також слід врахувати,
що методи дій повинні бути публічними ("public"). Приватні ("private") або захищені ("protected") методи
НЕ визначають вбудованих дій.
В основному використовуються вбудовані дії, оскільки для їх створення не потрібного багато зусиль.
Тим не менше, якщо ви плануєте повторно використовувати деякі дії у різних місцях або якщо ви хочете
перерозподілити дії, ви повинні визначити їх як *окремими діями*.
перерозподілити дії, ви повинні визначити їх як *автономні дії*.
### Окремі дії <span id="standalone-actions"></span>
### Автономні дії <span id="standalone-actions"></span>
Окремі дії визначаються в якості класів, успадкованих від [[yii\base\Action]] або його нащадків.
Наприклад, в релізах Yii присутні [[yii\web\ViewAction]] та [[yii\web\ErrorAction]], обидва класи є окремими діями.
Автономні дії визначаються в якості класів, успадкованих від [[yii\base\Action]] або його нащадків.
Наприклад, в релізах Yii присутні [[yii\web\ViewAction]] та [[yii\web\ErrorAction]], обидва класи
є окремими діями.
Для використання окремої дії, ви маєте вказати її у *мапі дій* за допомогою перевизначення методу
Для використання автономної дії, ви маєте вказати її у *мапі дій* за допомогою перевизначення методу
[[yii\base\Controller::actions()]] у вашому класі контролера, наступним чином:
```php
@ -281,11 +280,11 @@ public function actions()
}
```
Як ви можете бачити, метод `actions()` повинен повернути масив, ключами якого є ID дій, а значеннями - відповідні
назви класів дій або [конфігурацій](concept-configurations.md). На відміну від вбудованих дій, ID окремих дій
Як ви можете бачити, метод `actions()` повинен повернути масив, ключами якого є ідентифікатори дій, а значеннями - відповідні
назви класів дій або [конфігурації](concept-configurations.md). На відміну від вбудованих дій, ідентифікатори автономних дій
можуть містити довільні символи, доки вони визначені у методі `actions()`.
Для створення окремої дії, ви повинні успадкуватись від класу [[yii\base\Action]] або його нащадків, і реалізувати
Для створення класу автономної дії, ви повинні успадкуватись від класу [[yii\base\Action]] або його нащадків, і реалізувати
публічний ("public") метод `run()`. Роль метода `run()` аналогічна іншим методам дій. Наприклад,
```php
@ -306,20 +305,20 @@ class HelloWorldAction extends Action
### Результати дій <span id="action-results"></span>
Значення, що повертається від метода дії або метода `run()` окремої дії дуже важливе.
Значення, що повертається від методу дії або методу `run()` автономної дії дуже важливе.
Воно є результатом виконання відповідної дії.
Значення, що повертається, може бути об’єктом [відповіді](runtime-responses.md), яке буде відправлено
кінцевому користувачу.
Значення, що повертається, може бути об’єктом [відповіді](runtime-responses.md), яке буде відправлено кінцевому користувачу.
* Для [[yii\web\Application|веб-додатків]], значення, що повертається, також може бути довільними даними,
яке буде призначене до [[yii\web\Response::data]], а потім конвертоване у рядок, що представляє тіло відповіді.
яке буде призначене до [[yii\web\Response::data]], а потім конвертоване у текстовий рядок, що представляє тіло відповіді.
* Для [[yii\console\Application|консольних додатків]], значення, що повертається, також може бути числом, що
представляє [[yii\console\Response::exitStatus|статус виходу]] виконання команди.
В вищенаведених прикладах всі результати дій є рядками, які будуть використані у якості тіла відповіді користувачу.
Наступний приклад показує як дія може перенаправити браузер користувача на новий URL за допомогою
повернення об’єкта відповіді (оскільки метод [[yii\web\Controller::redirect()|redirect()]] повертає об’єкт response):
У вищенаведених прикладах всі результати дій є текстовими рядками, які будуть використані у якості тіла відповіді для
відправлення кінцевому користувачу. Наступний приклад показує як дія може перенаправити браузер користувача на новий URL
за допомогою повернення об’єкта відповіді (оскільки метод [[yii\web\Controller::redirect()|redirect()]] повертає
об’єкт response):
```php
public function actionForward()
@ -332,12 +331,12 @@ public function actionForward()
### Параметри дій <span id="action-parameters"></span>
Методи дій для вбудованих дій і методи `run()` для окремих дій можуть приймати, так звані, *параметри дії*.
Методи дій для вбудованих дій і методи `run()` для автономних дій можуть приймати, так звані, *параметри дії*.
Їх значення беруться із запитів. Для [[yii\web\Application|веб-додатків]], значення кожного з параметрів дії
береться із `$_GET`, використовуючи назву параметра у якості ключа;
для [[yii\console\Application|консольних додатків]] - вони відповідають аргументам командної строки.
для [[yii\console\Application|консольних додатків]] - вони відповідають аргументам командного рядка.
В наступному прикладі, дія `view` (вбудовона дія) визначає два параметри: `$id` і `$version`.
В наступному прикладі, дія `view` (вбудована дія) оголошує два параметри: `$id` і `$version`.
```php
namespace app\controllers;
@ -356,7 +355,7 @@ class PostController extends Controller
Параметри дії будуть заповнені для різних запитів наступним чином:
* `http://hostname/index.php?r=post/view&id=123`: параметру `$id` буде присвоєне значення `'123'`, у той час,
як `$version` буде мати значення null, так як рядок запиту не містить параметра `version`.
як `$version` буде мати значення null, бо рядок запиту не містить параметра `version`.
* `http://hostname/index.php?r=post/view&id=123&version=2`: параметрам `$id` і `$version` будуть присвоєні
значення `'123'` і `'2'` відповідно.
* `http://hostname/index.php?r=post/view`: буде отримане виключення [[yii\web\BadRequestHttpException]], оскільки
@ -364,8 +363,7 @@ class PostController extends Controller
* `http://hostname/index.php?r=post/view&id[]=123`: буде отримане виключення [[yii\web\BadRequestHttpException]],
оскільки параметр `$id` отримав невірне значення `['123']`.
Якщо ви хочете, щоб параметр дії приймав масив значень, ви повинні використати type-hint `array` параметра метода,
як зображено нажче:
Якщо ви хочете, щоб параметр дії приймав масив значень, ви повинні вказати тип `array` для параметра метода, як наведено нижче:
```php
public function actionView(array $id, $version = null)
@ -376,7 +374,7 @@ public function actionView(array $id, $version = null)
Тепер, якщо запит буде містити URL `http://hostname/index.php?r=post/view&id[]=123`, то параметр `$id` отримає
значення `['123']`. Якщо запит буде містити URL `http://hostname/index.php?r=post/view&id=123`, то параметр
`$id` все рівно отримає масив, оскільки скалярне значення `'123'` буде автоматично сконвертовано у масив.
`$id` все одно отримає масив, оскільки скалярне значення `'123'` буде автоматично перетворено у масив.
Вищенаведені приклади в основному показують як параметри дій працюють для веб-додатків. Більше інформації
про параметри консольних додатків наведено в розділі [Консольні команди](tutorial-console.md).
@ -385,10 +383,10 @@ public function actionView(array $id, $version = null)
### Дія за замовчуванням <span id="default-action"></span>
Кожний контролер містить дію за замовчуванням, визначену через властивість [[yii\base\Controller::defaultAction]].
Коли [маршрут](#routes) містить тільки ID контролера, то розуміється, що було запитана дія контролера
Коли [маршрут](#routes) містить тільки ідентифікатор контролера, то розуміється, що було запитана дія контролера
за замовчуванням.
За замовчуванням, ця дія має значення `index`. Якщо ви хочете змінити це значення - просто перевизначте дану
За замовчуванням, ця дія має значення `index`. Для зміни цього значення необхідно просто перевизначити дану
властивість у класі контролера наступним чином:
```php
@ -414,29 +412,27 @@ class SiteController extends Controller
який було запитано. Для виконання запиту, контролер пройде через наступні етапи життєвого циклу:
1. Метод [[yii\base\Controller::init()]] буде викликаний після того, як контролер був створений і сконфігурований.
2. Контролер створить об’єкт дії, базуючись на ID дії, яку було запитано:
* Якщо ID дії не вказано, то буде використано [[yii\base\Controller::defaultAction|ID дії за замовчуванням]];
* Якщо ID дії знайдено у [[yii\base\Controller::actions()|мапі дій]], то буде створено окрему дію;
* Якщо ID дії відповідає методу дії, то буде створено вбудовану дію;
2. Контролер створить об’єкт дії, базуючись на ідентифікаторі дії, яку було запитано:
* Якщо ідентифікатор дії не вказано, то буде використано [[yii\base\Controller::defaultAction|ідентифікатор дії за замовчуванням]];
* Якщо ідентифікатор дії знайдено у [[yii\base\Controller::actions()|мапі дій]], то буде створено автономну дію;
* Якщо ідентифікатор дії відповідає методу дії, то буде створено вбудовану дію;
* В іншому випадку, буде отримане виключення [[yii\base\InvalidRouteException]].
3. Контролер послідовно викликає метод `beforeAction()` додатка, модуля (якщо контролер належить модулю) і
самого контролера.
самого контролера:
* Якщо один із методів повернув `false`, то решта невикликаних методів `beforeAction` будуть пропущені,
а виконання дії буде відмінено;
* За замовчуванням, кожний виклик метода `beforeAction()` викликає подію `beforeAction`, на яку ви можете
призначити обробники.
а виконання дії буде скасовано;
* За замовчуванням, кожний виклик метода `beforeAction()` викликає подію `beforeAction`, на яку ви можете призначити обробник.
4. Контролер виконує дію:
* Параметри дії будуть проаналізовані і заповнені із даних запиту.
5. Контролер послідовно викликає методи `afterAction` контролера, модуля (якщо контролер належить модулю) і додатка.
* За замовчуванням, кожний виклик метода `afterAction()` викликає подію `afterAction`, на яку ви можете
призначити обробники.
* Параметри дії будуть проаналізовані та заповнені із даних запиту.
5. Контролер послідовно викликає методи `afterAction` контролера, модуля (якщо контролер належить модулю) і додатка:
* За замовчуванням, кожний виклик метода `afterAction()` викликає подію `afterAction`, на яку ви можете призначити обробник.
6. Додаток, отримавши результат виконання дії, привласнює його об’єкту [response](runtime-responses.md).
## Кращі практики <span id="best-practices"></span>
В добре організованих додатках, контролери за звичай дуже тонкі, і містять лише декілька рядків коду.
Якщо ваш контролер дуже складний, це за звичай означає, що вам потрібно провести його рефакторинг і
В добре організованому додатку контролери, зазвичай дуже малі, з діями, що містять лише декілька рядків коду.
Якщо ваш контролер дуже складний, це зазвичай означає, що вам потрібно провести його рефакторинг і
перенести деякий код в інші класи.
В цілому, контролери

511
docs/guide-uk/structure-models.md

@ -0,0 +1,511 @@
Моделі
======
Моделі є частиною архітектури [MVC](http://uk.wikipedia.org/wiki/Модель-вид-контролер).
Це об’єкти, які представляють бізнес-дані, бізнес-правила та бізнес-логіку.
Ви можете створювати класи моделей шляхом розширення класу [[yii\base\Model]] або його нащадків. Базовий клас
[[yii\base\Model]] підтримує багато корисних можливостей:
* [Атрибути](#attributes): представляють бізнес-дані та можуть бути доступними як звичайні властивості об’єкту
або як елементи масиву;
* [Мітки атрибутів](#attribute-labels): визначають мітки, які використовуються при відображенні атрибутів;
* [Масове призначення](#massive-assignment): підтримується заповнення декількох атрибутів одним кроком;
* [Правила перевірки](#validation-rules): забезпечують ввід даних на основі оголошених правил перевірки;
* [Експортування даних](#data-exporting): дозволяє даним моделі бути експортованими у масиви з налаштуванням форматів.
Клас `Model` також є базовим класом для більш розширених моделей, таких як [Active Record](db-active-record.md).
Будь ласка, зверніться до відповідної документації для більш детальної інформації про ці розширені моделі.
> Інформація: Не обов’язково створювати класи моделей на базі класу [[yii\base\Model]]. Однак, оскільки багато компонентів Yii
побудовані так, щоб підтримувати [[yii\base\Model]], краще використовувати його як базовий клас для моделей.
## Атрибути <span id="attributes"></span>
Моделі представляють бізнес-дані у вигляді *атрибутів*. Кожний атрибут є публічно доступною властивістю
моделі. Метод [[yii\base\Model::attributes()]] визначає, які атрибути має клас моделі.
Ви можете отримати доступ до атрибута як до звичайної властивості об’єкту:
```php
$model = new \app\models\ContactForm;
// "name" - це атрибут моделі ContactForm
$model->name = 'example';
echo $model->name;
```
Ви також можете отримувати доступ до атрибутів як до елементів масиву, завдяки підтримці
[ArrayAccess](http://php.net/manual/en/class.arrayaccess.php) та [ArrayIterator](http://php.net/manual/en/class.arrayiterator.php)
у класі [[yii\base\Model]]:
```php
$model = new \app\models\ContactForm;
// доступ до атрибутів як до елементів масиву
$model['name'] = 'example';
echo $model['name'];
// перебір атрибутів
foreach ($model as $name => $value) {
echo "$name: $value\n";
}
```
### Визначення атрибутів <span id="defining-attributes"></span>
За замовчуванням, якщо ваш клас моделі успадкований безпосередньо від [[yii\base\Model]], усі його *не статичні публічні* приналежні
змінні є атрибутами. Наприклад, клас моделі `ContactForm`, наведений нижче, має чотири атрибути: `name`, `email`,
`subject` і `body`. Модель `ContactForm` використовується для презентування вхідних даних, отриманих з HTML-форми.
```php
namespace app\models;
use yii\base\Model;
class ContactForm extends Model
{
public $name;
public $email;
public $subject;
public $body;
}
```
Ви можете перевизначити метод [[yii\base\Model::attributes()]] для визначення атрибутів в інший спосіб. Метод повинен
повертати імена атрибутів у моделі. Наприклад, [[yii\db\ActiveRecord]] повертає
імена колонок відповідної таблиці бази даних як імена атрибутів. Також можливо знадобиться перевизначити
магічні методи, такі як `__get()` і `__set()`, щоб атрибути могли бути доступними як
звичайні властивості об’єкту.
### Мітки атрибутів <span id="attribute-labels"></span>
При відображенні значень чи при отриманні вводу для атрибутів, часто необхідно відобразити деякі написи пов’язані з
атрибутами. Наприклад, якщо атрибут має ім’я `firstName`, ви можете відобразити мітку `First Name`, яка є більш зручною
для користувача при відображенні кінцевим користувачам у таких місцях як поля форми чи повідомлення про помилки.
Ви можете отримати мітку атрибуту викликом методу [[yii\base\Model::getAttributeLabel()]]. Наприклад,
```php
$model = new \app\models\ContactForm;
// відобразить "Name"
echo $model->getAttributeLabel('name');
```
За замовчуванням мітки атрибутів генеруються автоматично з імен атрибутів. Генерація виконується
методом [[yii\base\Model::generateAttributeLabel()]]. Він перетворить імена змінних зі стилю "camel-case" у
декілька слів з першою літерою у кожному слові у верхньому регістрі. Наприклад, `username` стане `Username`,
а `firstName` стане `First Name`.
Якщо ви не хочете використовувати автоматично згенеровані мітки, ви можете перевизначити [[yii\base\Model::attributeLabels()]]
для точного визначення міток атрибутів. Наприклад,
```php
namespace app\models;
use yii\base\Model;
class ContactForm extends Model
{
public $name;
public $email;
public $subject;
public $body;
public function attributeLabels()
{
return [
'name' => 'Your name',
'email' => 'Your email address',
'subject' => 'Subject',
'body' => 'Content',
];
}
}
```
Для додатків, що підтримують декілька мов, ви можливо захочете перекласти мітки атрибутів. Це можливо зробити
у методі [[yii\base\Model::attributeLabels()|attributeLabels()]] також, як показано нижче:
```php
public function attributeLabels()
{
return [
'name' => \Yii::t('app', 'Your name'),
'email' => \Yii::t('app', 'Your email address'),
'subject' => \Yii::t('app', 'Subject'),
'body' => \Yii::t('app', 'Content'),
];
}
```
Ви можете навіть умовно визначати мітки атрибутів. Наприклад, на основі [сценарію](#scenarios), в якому модель
використовується, ви можете повертати різні мітки для одного й того ж атрибуту.
> Інформація: Строго кажучи, мітки атрибутів є частиною [представлень](structure-views.md). Але оголошення міток
у моделях є часто дуже зручним та призводить до чистоти коду та можливості його повторного використання.
## Сценарії <span id="scenarios"></span>
Модель може бути використана у різних *сценаріях*. Наприклад, модель `User` може бути використана для збору вводу при вході користувача,
але також вона може бути використана з метою реєстрації користувача. У різних сценаріях модель може використовувати різні
бізнес-правила та бізнес-логіку. Наприклад, атрибут `email` може бути обов’язковим у процесі реєстрації користувача,
але не потрібним у процесі входу користувача.
Модель використовує властивість [[yii\base\Model::scenario]] для того, щоб відслідковувати сценарій, в якому вона використовується.
За замовчуванням модель підтримує тільки один сценарій іменований `default`. Наступний код показує два шляхи
призначення сценарію моделі:
```php
// сценарій призначено як властивість
$model = new User;
$model->scenario = 'login';
// сценарій призначено через конфігурацію
$model = new User(['scenario' => 'login']);
```
За замовчуванням сценарії, які підтримуються моделлю, обумовлюються [правилами перевірки](#validation-rules) оголошеними
у моделі. Однак, ви можете змінити цю поведінку, перевизначивши метод [[yii\base\Model::scenarios()]]
як показано нижче:
```php
namespace app\models;
use yii\db\ActiveRecord;
class User extends ActiveRecord
{
public function scenarios()
{
return [
'login' => ['username', 'password'],
'register' => ['username', 'email', 'password'],
];
}
}
```
> Інформація: У вищенаведеному та у наступних прикладах класи моделей успадковані від [[yii\db\ActiveRecord]],
тому що використання декількох сценаріїв зазвичай відбувається з класами [Active Record](db-active-record.md).
Метод `scenarios()` повертає масив, ключами якого є імена сценаріїв, а значеннями - відповідні
*активні атрибути*. Активні атрибути можуть бути [масово призначеними](#massive-assignment) та підлягають
[перевірці](#validation-rules). У вищенаведеному прикладі, атрибути `username` і `password` є активними
у сценарії `login`; в той час як у сценарії `register`, також активним є атрибут `email` разом з `username` і `password`.
Стандартна реалізація методу `scenarios()` повертає усі сценарії, знайдені у правилах перевірки, оголошених
методом [[yii\base\Model::rules()]]. При перевизначенні методу `scenarios()`, якщо ви хочете ввести нові сценарії
в добавок до тих сценаріїв, необхідно написати код подібний до наступного:
```php
namespace app\models;
use yii\db\ActiveRecord;
class User extends ActiveRecord
{
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['login'] = ['username', 'password'];
$scenarios['register'] = ['username', 'email', 'password'];
return $scenarios;
}
}
```
Можливості сценаріїв в основному використовуються при [перевірці](#validation-rules) та [масовому призначенні](#massive-assignment) атрибутів.
Однак, ви можете використовувати їх для інших цілей. Наприклад, ви можете оголошувати [мітки атрибутів](#attribute-labels)
по-різному в залежності від поточного сценарію.
## Правила перевірки <span id="validation-rules"></span>
Дані для моделі, які отримуються від кінцевих користувачів, повинні пройти перевірку, щоб пересвідчитись, що вони задовольняють
певні правила (названі *правилами перевірки*, також відомі як *бізнес-правила*). Наприклад, дано модель `ContactForm`,
ви можливо хочете пересвідчитись, що всі атрибути заповнені та атрибут `email` містить коректну адресу e-mail.
Якщо значення для деяких атрибутів не задовольняють відповідні бізнес-правила, то будуть відображенні належні
повідомлення про помилки, щоб допомогти користувачу виправити їх.
Ви можете викликати [[yii\base\Model::validate()]] для перевірки отриманих даних. Даний метод використає
правила перевірки, оголошені у [[yii\base\Model::rules()]], для перевірки кожного необхідного атрибуту. При відсутності
помилок він поверне true. В іншому випадку, він збереже помилки у властивості [[yii\base\Model::errors]]
та поверне false. Наприклад:
```php
$model = new \app\models\ContactForm;
// заповнення атрибутів моделі даними від користувача
$model->attributes = \Yii::$app->request->post('ContactForm');
if ($model->validate()) {
// усі дані є коректними
} else {
// невдала перевірка: $errors - масив, що містить повідомлення про помилки
$errors = $model->errors;
}
```
Для оголошення правил перевірки, пов’язаних з моделлю, необхідно перевизначити метод [[yii\base\Model::rules()]], повернувши
правила, які атрибути моделі повинні задовольнити. Наступний приклад показує правила перевірки, оголошені
для моделі `ContactForm`:
```php
public function rules()
{
return [
// атрибути name, email, subject і body є обов’язковими
[['name', 'email', 'subject', 'body'], 'required'],
// атрибут email повинен бути коректною адресою e-mail
['email', 'email'],
];
}
```
Правило може використовуватись для перевірки одного або кількох атрибутів, також атрибут може перевірятись одним або кількома правилами.
Будь ласка, зверніться до розділу [Перевірка вводу](input-validation.md) для більш детальної інформації про те, як оголошувати
правила перевірки.
Іноді необхідно, щоб правила застосовувались лише у певних [сценаріях](#scenarios). Для цього ви можете
визначати властивість `on` для правила, як наведено нижче:
```php
public function rules()
{
return [
// username, email і password є обов’язковими у сценарії "register"
[['username', 'email', 'password'], 'required', 'on' => 'register'],
// username і password є обов’язковими у сценарії "login"
[['username', 'password'], 'required', 'on' => 'login'],
];
}
```
Якщо ви не визначите властивість `on`, то правило буде застосоване у всіх сценаріях. Правило називається
*активним правилом*, якщо воно може бути застосоване у поточному [[yii\base\Model::scenario|сценарії]].
Атрибут буде перевірятись тоді й лише тоді, якщо він є активним атрибутом, оголошеним у `scenarios()` і
пов’язаний з одним або кількома активними правилами, оголошеними у `rules()`.
## Масове призначення <span id="massive-assignment"></span>
Масове призначення - це зручний спосіб заповнення моделі даними, введеними користувачем, використовуючи один рядок коду.
Атрибути моделі заповнюються шляхом призначення вхідних даних безпосередньо властивості [[yii\base\Model::$attributes]].
Наступні два приклади коду є еквівалентними, обидва намагаються призначити дані з форми, представлені кінцевими користувачами,
атрибутам моделі `ContactForm`. Явно, що перший приклад, який використовує масове призначення, є набагато чистішим
й менш схильним до помилок, ніж другий:
```php
$model = new \app\models\ContactForm;
$model->attributes = \Yii::$app->request->post('ContactForm');
```
```php
$model = new \app\models\ContactForm;
$data = \Yii::$app->request->post('ContactForm', []);
$model->name = isset($data['name']) ? $data['name'] : null;
$model->email = isset($data['email']) ? $data['email'] : null;
$model->subject = isset($data['subject']) ? $data['subject'] : null;
$model->body = isset($data['body']) ? $data['body'] : null;
```
### Безпечні атрибути <span id="safe-attributes"></span>
Масові призначення застосовуються лише до так званих *безпечних атрибутів*, які є атрибутами, що перелічені у
[[yii\base\Model::scenarios()]] для поточного [[yii\base\Model::scenario|сценарію]] моделі.
Наприклад, якщо модель `User` має нижченаведене оголошення сценарію, потім, коли поточним сценарієм
буде `login`, лише `username` і `password` можуть бути масово призначеними. Усі інші атрибути
будуть проігноровані.
```php
public function scenarios()
{
return [
'login' => ['username', 'password'],
'register' => ['username', 'email', 'password'],
];
}
```
> Інформація: Причиною того, що масове призначення застосовується лише для безпечних атрибутів є необхідність
контролювати те, які атрибути можуть змінюватись даними від кінцевого користувача. Наприклад, якщо модель `User`
має атрибут `permission`, який визначає дозволи призначені користувачу, то необхідно бути впевненим,
що цей атрибут може змінюватись лише адміністраторами через back-end інтерфейс.
Стандартна реалізація методу [[yii\base\Model::scenarios()]] повертає усі сценарії та атрибути,
знайдені у [[yii\base\Model::rules()]], якщо ви не перевизначили цей метод. Це означає, що атрибут є безпечним поки
знаходиться в одному із активних правил перевірки.
З цієї причини, надається спеціальний валідатор з псевдонімом `safe`, що дозволяє оголошувати атрибут
безпечним без фактичної його перевірки. Наприклад, наступне правило оголошує обидва атрибути `title`
і `description` безпечними:
```php
public function rules()
{
return [
[['title', 'description'], 'safe'],
];
}
```
### Небезпечні атрибути <span id="unsafe-attributes"></span>
Як описано вище, метод [[yii\base\Model::scenarios()]] слугує двом цілям: вирішенню, які атрибути
повинні бути перевірені, і вирішенню, які атрибути є безпечними. У деяких рідких випадках, існує необхідність перевірити
атрибут, але не позначати його безпечним. Цього можна досягнути за допомогою префіксу знак оклику `!` у імені
атрибуту при його оголошені в `scenarios()`, як у атрибута `secret` в наведеному прикладі:
```php
public function scenarios()
{
return [
'login' => ['username', 'password', '!secret'],
];
}
```
Коли модель буде присутня у сценарії `login`, усі три атрибути будуть перевірені. Однак, лише атрибути
`username` і `password` можуть бути масово призначеними. Для призначення атрибуту `secret` вхідного значення
необхідно зробити це явно, як наведено нижче:
```php
$model->secret = $secret;
```
## Експортування даних <span id="data-exporting"></span>
Часто існує потреба експортувати моделі у різні формати. Наприклад, може виникнути необхідність в перетворенні набору
моделей у формат JSON або Excel. Процес експортування може бути розділений на два незалежні кроки.
Першим кроком, моделі перетворюються у масиви; другим кроком, масиви перетворюються у
відповідні формати. Ви можете зосередитись лише на першому кроці, оскільки другий крок можна виконати за допомогою
загальних форматтерів даних, одним з яких є [[yii\web\JsonResponseFormatter]].
Найпростіший спосіб перетворення моделі у масив - це використання властивості [[yii\base\Model::$attributes]].
Наприклад:
```php
$post = \app\models\Post::findOne(100);
$array = $post->attributes;
```
За замовчуванням властивість [[yii\base\Model::$attributes]] поверне значення *усіх* атрибутів,
оголошених у [[yii\base\Model::attributes()]].
Більш гнучкий та потужний спосіб перетворення моделі в масив - це використання методу [[yii\base\Model::toArray()]].
Його типова поведінка така ж як у [[yii\base\Model::$attributes]]. Однак, він дозволяє обирати,
які елементи даних, що називаються *полями*, включати до масиву та як вони повинні бути форматовані.
Насправді, це стандартний спосіб експортування моделей при розробці веб-сервісів RESTful, як описано у
розділі [Форматування відповіді](rest-response-formatting.md).
### Поля <span id="fields"></span>
Поле - це просто іменований елемент у масиві, отриманому через виклик методу [[yii\base\Model::toArray()]]
моделі.
За замовчуванням імена полів є еквівалентними іменам атрибутів. Однак, можливо змінити цю поведінку за допомогою перевизначення
методів [[yii\base\Model::fields()|fields()]] і/або [[yii\base\Model::extraFields()|extraFields()]]. Обидва методи
повинні повертати перелік визначень полів. Поля, визначені у `fields()` є полями за замовчуванням, це означає, що
`toArray()` повертатиме ці поля за замовчуванням. Метод `extraFields()` визначає додатково доступні поля,
які також можуть бути повернутими через `toArray()`, якщо будуть зазначені у параметрі `$expand`. Наприклад,
наступний код буде повертати усі поля, визначені у `fields()`, а також поля `prettyName` і `fullAddress`,
якщо вони визначені у `extraFields()`:
```php
$array = $model->toArray([], ['prettyName', 'fullAddress']);
```
Ви можете перевизначити `fields()`, щоб додати, видалити, перейменувати або перевизначити поля. Значенням, яке повертатиме `fields()`,
повинен бути масив. Ключами масиву є імена полів, а значеннями масиву - відповідні
визначення полів, які можуть бути або іменами властивостей/атрибутів, або анонімними функціями, що повертають
відповідні значення полів. В окремому випадку, коли ім’я поля збігається з ім’ям його атрибуту,
ви можете пропустити ключ масиву. Наприклад:
```php
// точний перелік кожного поля найкраще використовувати тоді, коли ви хочете бути впевненим, що зміни
// у вашій таблиці БД або у атрибутах моделі не викликають змін ваших полів (для збереження зворотної сумісності API)
public function fields()
{
return [
// ім’я поля збігається з ім’ям атрибуту
'id',
// ім’я поля - "email", ім’я відповідного атрибуту - "email_address"
'email' => 'email_address',
// ім’я поля - "name", його значення визначене за допомогою анонімної PHP-функції
'name' => function () {
return $this->first_name . ' ' . $this->last_name;
},
];
}
// відфільтровування деяких полів найкраще використовувати тоді, коли ви хочете
// успадкувати батьківську реалізацію та виключити деякі "чутливі" поля
public function fields()
{
$fields = parent::fields();
// вилучити поля, які містять конфіденційну інформацію
unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']);
return $fields;
}
```
> Попередження: Оскільки за замовчуванням усі атрибути моделі будуть включені до масиву, що експортується, ви повинні
> перевірити ваші дані, щоб бути впевненим, що вони не містять конфіденційної інформації. Якщо ж така інформація присутня,
> вам потрібно перевизначити метод `fields()` та відфільтрувати її. У вищенаведеному прикладі були
> відфільтровані поля `auth_key`, `password_hash` і `password_reset_token`.
## Кращі практики <span id="best-practices"></span>
Моделі є центральним місцем презентування бізнес-даних, бізнес-правил і бізнес-логіки. Вони часто потребують повторного
використання у різних місцях. В добре організованому додатку моделі зазвичай набагато більші, ніж
[контролери](structure-controllers.md).
В цілому, моделі
* можуть містити атрибути для презентування бізнес-даних;
* можуть містити правила перевірки для забезпечення коректності та цілісності даних;
* можуть містити методи, які реалізують бізнес-логіку;
* НЕ повинні безпосередньо отримувати доступ до запиту, сесії або будь-яких інших даних середовища. Ці дані повинні бути введені
у моделі за допомогою [контролерів](structure-controllers.md);
* повинні уникати вкладеного HTML- або іншого презентаційного коду - це краще робити у [представленнях](structure-views.md);
* мають уникати завеликої кількості [сценаріїв](#scenarios) в одній моделі.
Як правило, ви можете враховувати останню рекомендацію, з наведених вище, тоді, коли розробляєте великі складні системи.
У цих системах моделі можуть бути дуже великими, оскільки вони використовуються у багатьох місцях й тому можуть містити
багато наборів правил і бізнес-логіки. Це часто перетворюється у кошмар під час супроводу коду моделі,
через те, що невелика зміна коду може зачіпати декілька різних місць. Щоб полегшити супровід коду моделі,
вам необхідно дотримуватися наступної стратегії:
* Визначити набір базових класів моделей, які є спільними для різних [додатків](structure-applications.md) або
[модулів](structure-modules.md). Ці класи моделей повинні містити мінімальний набір правил та логіки, які
є загальними для усіх додатків та модулів, які їх використовують.
* У кожному [додатку](structure-applications.md) або [модулі](structure-modules.md), який використовує модель,
визначити конкретний клас моделі, що розширює відповідний базовий клас моделі. Конкретні класи моделей
повинні містити правила та логіку, які є специфічними для додатка чи модуля.
Наприклад, у [розширеному шаблоні проекту](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-uk/README.md), ви можете визначати базовий клас
моделі `common\models\Post`. Потім для front-end додатку ви визначаєте та використовуєте конкретний клас моделі
`frontend\models\Post`, який розширює клас `common\models\Post`. Аналогічно для back-end додатку,
ви визначаєте `backend\models\Post`. Подібна стратегія дає вам впевненість в тому, що код у `frontend\models\Post`
є специфічним тільки для front-end додатку, та якщо ви внесете будь-які зміни до нього, то не має потреби турбуватись, що
зміни можуть порушити back-end додаток.

4
docs/guide-uk/tutorial-yii-integration.md

@ -108,7 +108,7 @@ new yii\web\Application($yiiConfig); // НЕ ВИКЛИКАЙТЕ run() в ць
Як ви бачите, цей код дуже схожий на код [вхідного скрипта](structure-entry-scripts.md) типового додатку Yii.
Єдина відмінність заключається в тому, що після створення екземпляру додатку, метод `run()` не викликається.
Це звʼязано з тим, що при виклику `run()`, Yii захоплює контроль над процесом обробки запиту, що в даному випадку
не є потрібним, так як цю задачу виконує вже наявний додаток.
не є потрібним, оскільки цю задачу виконує вже наявний додаток.
Як і у випадку з Yii додатком, вам необхідно налаштувати екземпляр додатку, виходячи із середовища запущеної сторонньої системи.
Наприклад, щоб скористатися можливостями [Active Record](db-active-record.md), необхідно налаштувати
@ -145,7 +145,7 @@ $yii1Config = require(__DIR__ . '/../config/yii1/main.php');
Yii::createWebApplication($yii1Config)->run();
```
Так як Yii 1 і Yii 2 використовують клас `Yii`, вам необхідно створити модифіковану версію, щоб обʼєднати їх.
Оскільки Yii 1 та Yii 2 використовують клас `Yii`, вам необхідно створити модифіковану версію, щоб обʼєднати їх.
Наведений нижче код підключить модифікований файл класу `Yii`, який може бути створений наступним чином.
```php

10
docs/internals-uk/translation-workflow.md

@ -78,17 +78,20 @@ php build translation "../docs/guide" "../docs/guide-uk" "Ukrainian guide transl
- Advanced/Basic Project Template — Розширений/Базовий шаблон проекту;
- alias — псевдонім;
- (Web) application — (веб-)додаток;
- assignment — призначення;
- attach handler — приєднати обробник;
- attribute of the model — атрибут моделі;
- authentication — аутентифікація / установлення справжності;
- authorization — авторизація/уповноваження;
- autoloader — автозавантажувач;
- back-end — (не перекладається);
- bootstrap, bootstrapping — початкове завантаження;
- branch — гілка;
- browser — браузер;
- (asset) bundle — колекція (ресурсів);
- cache — кеш;
- camel case — (не перекладається);
- case-sensitive — регістр-залежний;
- column — колонка;
- commit — комміт;
- concatenation — конкатенація;
@ -111,13 +114,15 @@ php build translation "../docs/guide" "../docs/guide-uk" "Ukrainian guide transl
- existing — наявний/присутній; // перекладати як "існуючий" не вірно
- (PHP) extension — розширення (PHP);
- Facebook — Фейсбук;
- folder — папка/каталог;
- field (of the table) — поле/атрибут (таблиці);
- fixture — фікстура;
- folder — папка/каталог;
- footer — футер;
- fork — форк;
- formatter — форматтер;
- framework — фреймворк;
- front-controller — фронт-контролер;
- front-end — (не перекладається);
- getter — геттер;
- (event) handler — обробник (події);
- hash — хеш;
@ -150,8 +155,10 @@ php build translation "../docs/guide" "../docs/guide-uk" "Ukrainian guide transl
- property — властивість (обʼєкта);
- pull request — (не перекладається);
- query builder — конструктор запитів;
- refactoring — рефакторинг;
- to render, rendering — формувати, формування;
- related, relation — повʼязаний, звʼязок;
- release — реліз;
- repo, repository — репозиторій;
- resolve request — попередня обробка запиту;
- route, routing — маршрут, маршрутизація;
@ -161,6 +168,7 @@ php build translation "../docs/guide" "../docs/guide-uk" "Ukrainian guide transl
- shared hosting — віртуальний хостинг;
- (call) stack — стек (викликів);
- staging area — буферна зона;
- standalone — автономний;
- string — текстовий рядок;
- sub-directory — під-директорія;
- substitution — підставлення/заміщення;

Loading…
Cancel
Save