# Yii

## About

Yii - это высокопроизводительный компонентный PHP фреймворк, предназначенный для быстрой разработки современных веб-приложений. Слово Yii (произносится как Йи \[ji:]) в китайском языке означает «простой и эволюционирующий». Также Yii может расшифровываться как акроним Yes It Is!

После установки Yii базовое приложение будет доступно либо по URL [http://hostname/basic/web/index.php](http://hostname/basic/web/index.php), либо по [http://hostname/index.php](http://hostname/index.php), в зависимости от настроек Web сервера. Данный раздел - общее введение в организацию кода, встроенный функционал и обработку обращений приложением Yii.

## Yii Security Best Practice

[https://www.yiiframework.com/doc/guide/2.0/en/security-best-practices](https://www.yiiframework.com/doc/guide/2.0/en/security-best-practices)

## Example App

[https://github.com/yii2-starter-kit/yii2-starter-kit](https://github.com/yii2-starter-kit/yii2-starter-kit)

## Структура проекта

[Источник](https://www.yiiframework.com/doc/guide/2.0/ru/start-workflow)\
Ниже приведен список основных директорий и файлов вашего приложения (считаем, что приложение установлено в директорию basic):

```
basic/                  корневой каталог приложения
    composer.json       используется Composer'ом, содержит описание приложения
    config/             конфигурационные файлы
        console.php     конфигурация консольного приложения
        web.php         конфигурация Web приложения
    commands/           содержит классы консольных команд
    controllers/        контроллеры
    models/             модели
    runtime/            файлы, которые генерирует Yii во время выполнения приложения (логи, кэш и т.п.)
    vendor/             содержит пакеты Composer'а и, собственно, сам фреймворк Yii
    views/              виды приложения
    web/                корневая директория Web приложения. Содержит файлы, доступные через Web
        assets/         скрипты, используемые приложением (js, css)
        index.php       точка входа в приложение Yii. С него начинается выполнение приложения
    yii                 скрипт выполнения консольного приложения Yii
```

## Внутреннее устройство приложения

![Диаграмма](https://www.yiiframework.com/doc/guide/2.0/ru/images/application-structure.png)&#x20;

В целом, приложение Yii можно разделить на две категории файлов: расположенные в basic/web и расположенные в других директориях. Первая категория доступна через Web (например, браузером), вторая не доступна извне и не должна быть доступной т.к. содержит служебную информацию.

В Yii реализован архитектурный паттерн MVC, которая соответствует структуре директорий приложения. В директории models находятся [Модели](https://www.yiiframework.com/doc/guide/2.0/ru/structure-models), в views расположены [Виды](https://www.yiiframework.com/doc/guide/2.0/ru/structure-views), а в каталоге controllers все [Контроллеры](https://www.yiiframework.com/doc/guide/2.0/ru/structure-controllers) приложения.

В каждом приложении Yii есть точка входа в приложение, `web/index.php` это единственный PHP-скрипт доступный для выполнения из Web. Он принимает входящий запрос и создает экземпляр [приложения](https://www.yiiframework.com/doc/guide/2.0/ru/structure-applications). [Приложение](https://www.yiiframework.com/doc/guide/2.0/ru/structure-applications) обрабатывает входящие запросы при помощи [компонентов](https://www.yiiframework.com/doc/guide/2.0/ru/concept-components) и отправляет запрос контроллеру. [Виджеты](https://www.yiiframework.com/doc/guide/2.0/ru/structure-widgets) используются в [Видах](https://www.yiiframework.com/doc/guide/2.0/ru/structure-views) для построения динамических интерфейсов сайта.

## Жизненный цикл пользовательского запроса

![Диаграмма](https://www.yiiframework.com/doc/guide/2.0/ru/images/request-lifecycle.png)&#x20;

1 Пользователь обращается к точке входа web/index.php. \
2 Скрипт загружает конфигурацию configuration и создает экземпляр приложения для дальнейшей обработки запроса. \
3 Приложение определяет маршрут запроса при помощи компонента приложения запрос. \
4 Приложение создает экземпляр контроллера для выполнения запроса. \
5 Контроллер, в свою очередь, создает действие и накладывает на него фильтры. \
6 Если хотя бы один фильтр дает сбой, выполнение приложения останавливается. \
7 Если все фильтры пройдены - приложение выполняется. \
8 Действие загружает модель данных. Вероятнее всего из базы данных. \
9 Действие генерирует вид, отображая в нем данные (в т.ч. и полученные из модели). \
10 Сгенерированный вид приложения передается как компонент ответ. \
11 Компонент "ответ" отправляет готовый результат работы приложения браузеру пользователя.

## Составные части приложения на Yii

### Модели

[Модели](https://www.yiiframework.com/doc/guide/2.0/ru/structure-models) являются частью архитектуры MVC (Модель-Вид-Контроллер). Они представляют собой объекты бизнес данных, правил и логики.

### Виды

[Виды](https://www.yiiframework.com/doc/guide/2.0/ru/structure-views) - это часть MVC архитектуры, это код, который отвечает за представление данных конечным пользователям. В веб приложениях виды создаются обычно в виде видов - шаблонов, которые суть PHP скрипты, в основном содержащие HTML код и код PHP, отвечающий за представление и внешний вид. Виды управляются компонентом приложения view, который содержит часто используемые методы для упорядочивания видов и их рендеринга. Для упрощения, мы будем называть виды - шаблоны просто видами.

При создании видов, которые генерируют HTML страницы, важно кодировать и/или фильтровать данные, которые приходят от пользователей перед тем как их показывать. В противном случае ваше приложение может стать жертвой атаки типа межсайтовый скриптинг

Чтобы показать обычный текст, сначала кодируйте его с помощью yii\helpers\Html::encode(). В примере ниже имя пользователя кодируется перед выводом:

```php
<?php
use yii\helpers\Html;
?>

<div class="username">
    <?= Html::encode($user->name) ?>
</div>
```

Чтобы показать HTML содержимое, используйте yii\helpers\HtmlPurifier для того, чтобы отфильтровать потенциально опасное содержимое. В примере ниже содержимое поста фильтруется перед показом:

```php
<?php
use yii\helpers\HtmlPurifier;
?>

<div class="post">
    <?= HtmlPurifier::process($post->text) ?>
</div>
```

### Контроллеры

[Контроллеры](https://www.yiiframework.com/doc/guide/2.0/ru/structure-controllers) являются частью MVC архитектуры. Это объекты классов, унаследованных от yii\base\Controller, отвечающие за обработку запроса и генерирование ответа. В сущности, после обработки запроса приложениями, контроллеры проанализируют входные данные, передадут их в модели, вставят результаты модели в представления, и в конечном итоге сгенерируют исходящие ответы. Пример:

```php
[
    'homeUrl'             => Yii::getAlias('@apiUrl'),
    'controllerNamespace' => 'api\controllers',
    'defaultRoute'        => 'site/index',
    'bootstrap'           => ['maintenance'],
    'modules'             => [
        'v1' => \api\modules\v1\Module::class
    ],
    'components'          => [
        'errorHandler' => [
            'errorAction' => 'site/error'
        ],
        'maintenance'  => [
            'class'   => Maintenance::class,
            'enabled' => function($app) {
                return env('APP_MAINTENANCE') === '1';
            }
        ],
        'request'      => [
            'enableCookieValidation' => false,
        ],
        'user'         => [
            'class'           => User::class,
            'identityClass'   => RefUser::class,
            'loginUrl'        => ['/user/sign-in/login'],
            'enableAutoLogin' => true,
            'as afterLogin'   => LoginTimestampBehavior::class
        ]
    ]
];
```

тогда в api/controllers/\*.php будут реалищованы методы actionIndex, actionError

### Приложения

Приложения это объекты, которые управляют всей структурой и жизненным циклом прикладной системы Yii. Каждая прикладная система Yii включает в себя один объект приложения, который создается во входном скрипте и глобально доступен через \Yii::$app.

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

### Поведения

Behavior - поведения - позволяют расширить существующие компоненты, не изменяя дерево наследования [https://www.yiiframework.com/doc/guide/2.0/ru/concept-behaviors](https://www.yiiframework.com/doc/guide/2.0/ru/concept-behaviors)

### Виджеты

### Компоненты

### Конфигурация

[https://www.yiiframework.com/doc/guide/2.0/ru/concept-configurations](https://www.yiiframework.com/doc/guide/2.0/ru/concept-configurations)

#### Общий формат конфигураций:

```php
[
    'class' => 'ClassName',
    'propertyName' => 'propertyValue',
    'on eventName' => $eventHandler,
    'as behaviorName' => $behaviorConfig,
]
```

где: `class` - абсолютное имя класса создаваемого объекта\
`propertyName` - первоначальные значения свойств создаваемого объекта\
`on eventName` - указывают на то, какие обработчики должны быть прикреплены к событиям объекта. `as behaviorName` - указывают на то, какие поведения должны быть внедрены в объект. Обратите внимание, что ключи массива начинаются с as ; а $behaviorConfig представляет собой конфигурацию для создания поведения, похожую на все остальные конфигурации.

#### Пример конфигурации приложения

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

```php
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
        ],
        'log' => [
            'class' => 'yii\log\Dispatcher',
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                ],
            ],
        ],
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=stay2',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ],
    ],
];
```

Ключ class в данной конфигурации не указывается. Причина в том, что класс вызывается по полному имени во входном скрипте:

```php
(new yii\web\Application($config))->run();
```

#### Про `components`

[https://www.yiiframework.com/doc/guide/2.0/ru/structure-application-components](https://www.yiiframework.com/doc/guide/2.0/ru/structure-application-components)\
Данное свойство является наиболее важным. Оно позволяет вам зарегистрировать список именованных компонентов, называемых компоненты приложения, которые Вы можете использовать в других местах. Например,

```php
[
    'bootstrap' => [
        'cache',
    ],
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
    ],
]
```

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

#### У каждого приложения есть базовые компоненты

* `assetManager`: используется для управления и опубликования ресурсов приложения. Более детальная информация представлена в разделе Ресурсы;
* `db`: представляет собой соединение с базой данных, через которое вы можете выполнять запросы. Обратите внимание, что когда вы конфигурируете данный компонент, вы должны указать класс компонента также как и остальные необходимые параметры, такие как yii\db\Connection::$dsn. Более детальная информация представлена в разделе Объекты доступа к данным (DAO);
* `errorHandler`: осуществляет обработку PHP ошибок и исключений. Более детальная информация представлена в разделе Обработка ошибок;
* `formatter`: форматирует данные для отображения их конечному пользователю. Например, число может быть отображено с различными разделителями, дата может быть отображена в формате long. Более детальная информация представлена в разделе Форматирование данных;
* `i18n`: используется для перевода сообщений и форматирования. Более детальная информация представлена в разделе Интернационализация;
* `log`: обработка и маршрутизация логов. Более детальная информация представлена в разделе Логирование;
* `yii\swiftmailer\Mailer`: предоставляет возможности для составления и рассылки писем. Более детальная информация представлена в разделе Отправка почты;
* `response`: представляет собой данные от сервера, которые будет направлены пользователю. Более детальная информация представлена в разделе Ответы;
* `request`: представляет собой запрос, полученный от конечных пользователей. Более детальная информация представлена в разделе Запросы;
* `session`: информация о сессии. Данный компонент доступен только в веб приложениях. Более детальная информация представлена в разделе Сессии и куки;
* `urlManager`: используется для разбора и создания URL. Более детальная информация представлена в разделе Разбор и генерация URL;
* `user`: представляет собой информацию аутентифицированного пользователя. Данный компонент доступен только в веб приложениях. Более детальная информация представлена в разделе Аутентификация;
* `view`: используется для отображения представлений. Более детальная информация представлена в разделе Представления.
