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

Фреймворк Yii включает в себя следующие возможности:

  • Реализует для использования MVC (Model-View-Controller) архитектурный шаблон и способствует организации кода на основе этого шаблона.
  • Позволяет делать код простым и элегантным.
  • Yii является full-stack фреймворком, предоставляя множество проверенных и готовых к использованию функций: построитель запросов и ActiveRecord для реляционных и NoSQL баз данных, RESTful API, поддержку многоуровневого кэширования и т.п.
  • Yii чрезвычайно расширяемый фреймворк в котором можно заменить почти каждый кусочек кода и разрабатывать нужные расширения.
  •  Высокая производительность является основной задачей Yii

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

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

В настоящее время есть две основные версии фреймворка, которые можно использовать: 1.1 и 2.0. Версия 1.1 является старым поколением и теперь находится в режиме технического обслуживания. Версия 2.0 представляет собой полностью переписанный Yii, с внедренными новейшими технологиями и протоколами, в том числе: Composer, PSR, пространств имен, Traits и т.д.

Версия 2.0 представляет нынешнее поколение фреймворка и будет получать основные усилия в области развития в течение следующих нескольких лет.  Для использования Yii 2.0 требует PHP 5.4.0 или выше, а также базовых знаний объектно-ориентированного программирования (ООП).

Установка

Yii 2.0 полностью поддерживает Composer, де-факто менеджер пакетов PHP. Установка ядра фреймворка, а также расширений, обрабатываются с помощью Composer.

 

Требования PHP

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

  • Namespaces
  • Анонимные функции
  • Короткий синтаксис массива, используется:
$data = [
	1 => 'Item 1',
	2 => 'Item 2',
	3 => 'Item 3',
];

вместо массива:

$data = array(
	1 => 'Item 1',
	2 => 'Item 2',
	3 => 'Item 3',
);
  • Короткие теги. Используется:
<?= 'Hello world!' ?>

вместо:

<?php echo 'Hello world!'; ?>
  • 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, который наследует все методы построения запросов.

// Чтобы получить всех активных клиентов в порядке записей по ID 
$customers = Customer::find()
    ->where(['status' => $active])
    ->orderBy('id')
    ->all();


class Customer extends \yii\db\ActiveRecord
{
    public function getOrders()
    {
        return $this->hasMany('Order', ['customer_id' => 'id']);
    }
}