Yii - это бесплатный объектно-ориентированный компонентный full-stack PHP фреймворк. В основе Yii лежит другой фреймворк - PRADO, написанный на ASP.NET и впоследствии перенесенный на PHP. Вскоре после построения новой архитектуры, фреймворк PRADO был переименован на Yii. Название фреймворка является аббревиатурой слова «Yes It Is!». Прародителем фреймворка является китайский разработчик Qiang Xue.

Yii можно использовать для разработки любого вида веб-приложений. Благодаря своей основе компонентов, архитектуре и сложной поддержки кэширования, фреймворк подходит для разработки крупномасштабных проектов, таких как порталы, форумы, системы управления контентом (CMS), систем электронной коммерции, RESTful веб-сервисов и т.д.

Yii реализует для использования MVC (Model-View-Controller) архитектурный шаблон и способствует организации кода на основе этого шаблона.

Yii является full-stack фреймворком, предоставляя множество проверенных и готовых к использованию функций: построитель запросов и ActiveRecord для реляционных и NoSQL баз данных, RESTful API, поддержку многоуровневого кэширования и т.п.

Yii чрезвычайно расширяемый фреймворк в котором можно заменить почти каждый кусочек кода и разрабатывать нужные расширения.

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

 

Установка

Установка Yii 2.0, различных расширений и их управление осуществляется с помощью Composer - менеджера пакетов PHP. Однако это также можно сделать и вручную, скачав и распаковав zip архив.

Установка через Composer сводится к вводу самых простых команд через консоль:

composer global require "fxp/composer-asset-plugin:^1.2.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic project

 

Требования PHP

Yii 2.0 требует PHP 5.4 или выше, по сравнению с Yii 1.1, который использует PHP версии 5.2. В результате, есть много различий на уровне языка.

  • Namespaces
  • Анонимные функции
  • Короткий синтаксис массива
  • Короткая запись открывающих и закрывающих php тегов
  • SPL классы и интерфейсы.
  • Поздние статические привязки.
  • Дата и время.
  • Traits.
  • intl расширение PHP для интернационализации.

 

Namespace

В Yii 2.0 используются пространства имен, например, yii\web\Request. Имена присваиваются по структуре каталогов. Допустим, yii\web\Request указывает на то, что файл класса web/Request.php размещается в этом каталоге.

 

Компоненты и объекты

Yii 2.0 содержит два основных класса: класса: yii\base\Object и yii\base\Component. Класс объекта это легкий базовый класс, который определяет свойства объекта с помощью геттеров и сеттереров (getters и setters). Компонент класса поддерживает события и поведение.

 

Конфигурация объекта

Класс объекта вводит единый способ конфигурирования объектов. Любой потомок класс объекта должен объявить его конструктор:

class MyClass extends \yii\base\Object
{
   public function __construct($param1, $param2, $config = [])
   {
       // ... инициализация перед конфигурацией применена

       parent::__construct($config);
   }

   public function init()
   {
       parent::init();

       // ... инициализация после конфигурации применена
   }
}

Последний параметр конструктора должен принять массив конфигурации, содержащий пары имя-значение для инициализации свойств в конце конструктора. Вы можете переопределить метод init() для выполнения инициализации работы, которая должна быть сделана после того, как конфигурация была применена.

Таким образом, вы можете создавать и настраивать новые объекты, используя массив конфигурации:

$object = Yii::createObject([
   'class' => 'MyClass',
   'property1' => 'abc',
   'property2' => 'cde',
], [$param1, $param2]);

 

События

В Yii 2 можно использовать любое имя события, инициировав событие вызовом метода trigger():

$event = new \yii\base\Event;
$component->trigger($eventName, $event);

Чтобы прикрепить, обработчик к событию, нужно использовать метод on():

$component->on($eventName, $handler);
// Чтобы отсоединить обработчик, используйте:
// $component->off($eventName, $handler);

 

Псевдонимы пути

Yii 2.0 позволяет использование псевдонимов путей для файлов/каталогов и адресов. Путь псеводонима начинается с символа @, чтобы отличить псевдонимы от нормальных путей файлов и каталогов, а также адресов. Например, псевдоним @yii относится к каталогу установки Yii. Пути псевдонимов поддерживаются в большинстве мест основного кода Yii.

Допустим, yii\caching\FileCache::$cachePath может занять как псеводоним пути, так и нормальный путь к каталогу. Псевдоним пути также тесно связан с классом имен.

Рекомендуется, чтобы псевдоним пути был определен для каждого корневого пространства имен, тем самым позволяя использовать Yii класс автозагрузчика без какой-либо дополнительной конфигурации. Например, поскольку @yii относится к каталогу установки Yii, класс yii\web\Request может автоматически загружается.

Views

Объект yii\web\View представляет собой вид части шаблона MVC. Если вы хотите получить доступ к данным контроллера или виджета в представлении, вы можете использовать $this->context.

Для вывода шаблона нужно использовать $this->render(), который возвращает результат рендинга.

echo $this->render('_item', ['item' => $item]);

Кроме того, в качестве основного языка шаблона, Yii 2.0 также позволяет использовать такие популярные шаблонизаторы как: Smarty и Twig. Для использования этих шаблонизаторов, необходимо настроить компонент представления приложения, установив свойство View::$renderers.

Models

Yii 2.0 использует yii\base\Model в качестве базовой модели, а также имеет новый метод scenarios() позволяющий объявлять поддерживаемые сценарии, и указать, в соответствии с каким сценарием производить работу с атрибутами.

public function scenarios()
{
    return [
        'backend' => ['email', 'role'],
        'frontend' => ['email', '!role'],
    ];
}

В данном примере используется два сценария: backend и frontend.  Для сценария backend, атрибуты email и role являются обязательными и могут быть массово присвоены. Для сценария frontend, атрибут email может быть массово присвоен, в то время как role не может. И email и role должны быть проверены с помощью метода rules() используемого для объявления правил проверки.

Controllers

Yii 2.0 использует yii\web\Controller в качестве базового класса контроллера. yii\base\Action является базовым классом для классов действий. Действие в контроллере должно возвращать содержимое:

public function actionView($id)
{
    $model = \app\models\Post::findOne($id);
    if ($model) {
        return $this->render('view', ['model' => $model]);
    } else {
        throw new \yii\web\NotFoundHttpException;
    }
}

Widgets

Yii 2.0 использует yii\base\Widget в качестве базового класса виджетов. Виджет начинается с методов begin(), and() и widget() следующим образом:

use yii\widgets\Menu;
use yii\widgets\ActiveForm;

// Обратите внимание, что вам нужно «echo», чтобы отобразить результат
echo Menu::widget(['items' => $items]);

// Передача массива для инициализации свойств объекта
$form = ActiveForm::begin([
    'options' => ['class' => 'form-horizontal'],
    'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']],
]);
... поля формы для ввода здесь ...
ActiveForm::end();

Темы (Themes)

Темы работают на основе механизма отображения пути, который отображает путь к файлу просмотра исходных текстов на тематическом пути просмотра файлов.

Например, если карта пути для темы является ['/web/views' => '/web/themes/basic'], то тематический версия для файла просмотра /web/views/site/index.php будет /web/themes/basic/site/index.php. По этой причине, темы могут быть применены к любому файлу вида, даже вне контекста контроллера или виджета.

Консольные приложения

Консольные приложения организованы как контроллеры, как и веб-приложения. Контроллеры консоли должны проходить от yii\console\Controller. Чтобы выполнить команду консоли, используйте <route>, где <route> обозначает маршрут контроллера (например, sitemap/index). Дополнительные анонимные аргументы передаются в качестве параметров к соответствующему методу действия контроллера, в то время как названные аргументы обрабатываются в соответствии с декларациями в yii\console\Controller::options().

I18N

Перевод сообщений выполняется с помощью компонента приложения i18n. Этот компонент управляет набором источников сообщений, что позволяет использовать различные источники сообщений на основе категорий сообщений.

Фильтры действий (Action Filters)

Действия фильтров реализуются с помощью поведения. Новый встраиваемый фильтр определяется с помощью yii\base\ActionFilter. Чтобы использовать фильтр, прикрепите класс фильтра к контроллеру в качестве поведения. Например, чтобы использовать yii\filters\AccessControl фильтр, нужно:

public function behaviors()
{
    return [
        'access' => [
            'class' => 'yii\filters\AccessControl',
            'rules' => [
                ['allow' => true, 'actions' => ['admin'], 'roles' => ['@']],
            ],
        ],
    ];
}

Assets

Представляет собой набор asset bundle файлов (например, файлы JavaScript, CSS файлы, файлы изображений и т.д.) в пределах каталога. Каждый asset bundle представлен как класс, расширяющий yii\web\AssetBundle. Регистрируется asset bundle с помощью yii\web\AssetBundle::register().

Помощники

В Yii 2.0 используются статические вспомогательные классы, например, такие как:

  • yii\helpers\Html
  • yii\helpers\ArrayHelper
  • yii\helpers\StringHelper
  • yii\helpers\FileHelper
  • yii\helpers\Json

Формы

Формы в Yii 2.0 создаются с помощью yii\widgets\ActiveForm. Поле представляет собой контейнер, состоящий из метки, входа, сообщение об ошибке или текста подсказки. Поле представляется как объект ActiveField. Использование полей поможет создать более чистую форму:

<?php $form = yii\widgets\ActiveForm::begin(); ?>
    <?= $form->field($model, 'username') ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <div class="form-group">
        <?= Html::submitButton('Login') ?>
    </div>
<?php yii\widgets\ActiveForm::end(); ?>

Построитель запросов (Query Builder)

Yii 2.0 представляет собой запрос БД с точки зрения объекта запроса, который может быть превращен в SQL заявление с помощью QueryBuilder. Например:

$query = new \yii\db\Query();
$query->select('id, name')
      ->from('user')
      ->limit(10);

$command = $query->createCommand();
$sql = $command->sql;
$rows = $command->queryAll();

Active Record

Yii 2.0 вводит много изменений в Active Record. Два наиболее очевидных из них связаны с построением запросов и реляционной обработкой запросов. Построитель запросов используется с помощью класса yii\db\Query, который наследует все методы построения запросов.

 

Плюсы и минусы

Плюсы

  • Для русскоязычных разработчиков большим плюсом фреймворка, является хорошая документация, множество статей с примерами кода и сообщество.
  • Yii не показатель одного человека,  фреймворк подкреплен сильной командой разработчиков ядра, а также большим сообществом профессионалов постоянно способствующих развитию Yii.
  • Yii способствует быстрому прототипированию веб-приложения. Он относится к инструментам RAID разработки.
  • Встроенный механизм создания виджетов представления, например, для размещения на сайте различных блоков: последние посты, категории, навигация, блоки рекламы и т.п.
  • Компонент приложения i18n позволяет производить автоматический перевод сообщений веб-приложения.
  • Встроенная поддержка автоматической валидации форм и вывода сообщений об ошибках на основе данных из моделей веб-приложения.
  • Механизм Active Record для построения реляционной обработки запросов базы данных.
  • Множество готовых расширений на Github и их установка через Composer
  • Встроенные виджеты для отображения данных: DetailView (строки в таблице), ListView (Список), GridView (таблицы)
  • Встроенные механизмы для аутентификации, авторизации, регистрации пользователей
  • Содержит встроенную и очень удобную debug панель.

Минусы

  • Слабая экосистема вокруг фреймворка среди англоязычного сегмента разработчиков. Сообщество слишком сильно размазано по разным местам: несколько форумов с небольшой активностью, stackoverflow и т.п.
  • Хоть фреймворк и позволяет делать код простым, но далеко не элегантным. Если его синтаксис сравнивать с фреймворком Laravel, то он уступает.
  • Yii отстает от языка, стандартов и других фреймворков. Новые обновления с действительно полезными функциями выходят не так часто.
  • Слишком большая связанность backend и frontend частей Yii2. Фреймворк предлагает использовать библиотеку jQuery и Bootstrap, которые встроены по умолчанию в ядро фреймворка. Этот минус планируется исправить в новой версии фреймворка Yii 3, сделав его компоненты менее связанными.
  • Не очень гибкая система маршрутизации: нет возможности сгруппировать роуты.