Yii

About

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

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

Yii Security Best Practice

https://www.yiiframework.com/doc/guide/2.0/en/security-best-practices

Example App

https://github.com/yii2-starter-kit/yii2-starter-kit

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

Источник Ниже приведен список основных директорий и файлов вашего приложения (считаем, что приложение установлено в директорию 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

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

Диаграмма

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

В Yii реализован архитектурный паттерн MVC, которая соответствует структуре директорий приложения. В директории models находятся Модели, в views расположены Виды, а в каталоге controllers все Контроллеры приложения.

В каждом приложении Yii есть точка входа в приложение, web/index.php это единственный PHP-скрипт доступный для выполнения из Web. Он принимает входящий запрос и создает экземпляр приложения. Приложение обрабатывает входящие запросы при помощи компонентов и отправляет запрос контроллеру. Виджеты используются в Видах для построения динамических интерфейсов сайта.

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

Диаграмма

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

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

Модели

Модели являются частью архитектуры MVC (Модель-Вид-Контроллер). Они представляют собой объекты бизнес данных, правил и логики.

Виды

Виды - это часть MVC архитектуры, это код, который отвечает за представление данных конечным пользователям. В веб приложениях виды создаются обычно в виде видов - шаблонов, которые суть PHP скрипты, в основном содержащие HTML код и код PHP, отвечающий за представление и внешний вид. Виды управляются компонентом приложения view, который содержит часто используемые методы для упорядочивания видов и их рендеринга. Для упрощения, мы будем называть виды - шаблоны просто видами.

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

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

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

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

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

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

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

Контроллеры

Контроллеры являются частью MVC архитектуры. Это объекты классов, унаследованных от yii\base\Controller, отвечающие за обработку запроса и генерирование ответа. В сущности, после обработки запроса приложениями, контроллеры проанализируют входные данные, передадут их в модели, вставят результаты модели в представления, и в конечном итоге сгенерируют исходящие ответы. Пример:

[
    '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-configurations

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

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

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

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

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

$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 в данной конфигурации не указывается. Причина в том, что класс вызывается по полному имени во входном скрипте:

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

Про components

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

[
    '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: используется для отображения представлений. Более детальная информация представлена в разделе Представления.

Last updated