- [Интернационализация (Intl)](http://php.net/manual/ru/book.intl.php); Yii 2.0 использует расширение PHP `intl`
для различного функционала интернационализации.
Пространства имен
-----------------
Одним из основных изменений в Yii 2.0 является использование пространств имен. Почти каждый класс фреймворка
находится в пространстве имен, например, `yii\web\Request`. Префикс "С" больше не используется в именах классов.
Соглашение именования классов следует структуре папки, в которой располагается класс. Например, `yii\web\Request`
означает, что соответсвующий класс находится в файле `web/Request.php` в папке Yii фреймворка.
(Благодаря загрузчику классов Yii, вы можете использовать любой класс фреймворка без необходимости непосредственно
подключать его).
Компонент и Объект
------------------
В Yii 2.0 класс `CComponent` из версии 1.1 был разделен на два класса: [[yii\base\Object]] и [[yii\base\Component]].
Класс [[yii\base\Object|Object]] является простым базовым классом, который позволяет использовать [геттеры и сеттеры](concept-properties.md) для свойств.
Класс [[yii\base\Component|Component]] наследуется от класса [[yii\base\Object|Object]] и поддерживает [события](concept-events.md) и
[поведения](concept-behaviors.md).
Если вашему классу не нужно использовать функционал событий или поведений, вы можете использовать [[yii\base\Object|Object]] в качестве
базового класса. В основном это случаи, когда классы представляют собой базовые структуры.
Конфигурация объекта
--------------------
Класс [[yii\base\Object|Object]] предоставляет единый способ конфигурирования объектов. Любой дочерний класс [[yii\base\Object|Object]]
может определить конструктор (если нужно) для своей конфигурации следующим образом:
```php
class MyClass extends \yii\base\Object
{
public function __construct($param1, $param2, $config = [])
{
// ... инициализация до того, как конфигурация будет применена
parent::__construct($config);
}
public function init()
{
parent::init();
// ... инициализация после того, как конфигурация была применена
}
}
```
В примере выше, последний параметр конструктора должен быть массивом конфигурации, который содержит пары в формате
ключ-значение для инициализации свойств объекта. Вы можете переопределить метод [[yii\base\Object::init()|init()]] для
инициализации объекта после того, как конфигурация была применена к нему.
Следуя этому соглашению, вы сможете создавать и конфигурировать новые объекты с помощью массива конфигурации:
```php
$object = Yii::createObject([
'class' => 'MyClass',
'property1' => 'abc',
'property2' => 'cde',
], [$param1, $param2]);
```
Более детальная информация о конфигурация представлена в разделе [Конфигурации объектов](concept-configurations.md).
События
-------
В Yii1, события создавались с помощью объявления метода `on` (например, `onBeforeSave`). В Yii2 вы можете теперь
использовать любое имя события. Вы возбуждаете ивенты с помощью вызова метода [[yii\base\Component::trigger()|trigger()]].
```php
$event = new \yii\base\Event;
$component->trigger($eventName, $event);
```
Для прикрепления обработчика события используйте метод [[yii\base\Component::on()|on()]].
```php
$component->on($eventName, $handler);
// To detach the handler, use:
// $component->off($eventName, $handler);
```
Есть также и другие улучшения в функционале событий. Более детальная информация о конфигурация представлена в разделе [События](concept-events.md).
Псевдонимы пути
---------------
Yii 2.0 расширяет способ использования псевдонимов пути как для файлов и папок, так и для URL. В Yii 2.0 также
теперь требуется, чтобы имя псевдонима начиналось с символа `@`, для разграничения псевдонимов от обычных
путей файлов/папок и URL. Например, псевдоним `@yii` соответствует установочной папке Yii. Псевдонимы пути используются
во многих местах кода Yii. Например, [[yii\caching\FileCache::cachePath]] может использовать как псевдоним пути так и
обычный путь к папке.
Псевдонимы пути тесно связаны с пространством имен классов. Рекомендуется, что вы определите псевдоним пути для
каждого базового пространства имен, таким образом загрузчик классов Yii может использоваться без какой-либо дополнительной
конфигурации. Например, потому, что `@yii` соответствует установочной папке Yii, класс `yii\webRequest` может быть загружен.
Если вы используете сторонние библиотеки, такие как Zend Framework, вы можете также определить псевдоним пути `@Zend`,
который соответствует установочной папке фреймворка. Единожды сделав это, Yii будет способен автоматичеки загружать любой класс
Zend Framework.
Более детальная информация о конфигурациях представлена в разделе [Псевдонимы пути](concept-aliases.md).
Представления
-------------
Одним из основных изменений в Yii2 является то, что специальная переменная `$this` в представлении, больше не соответствует
текущему контроллеру или виджету. Вместо этого, `$this` теперь соответствует объекту *представления*, новой возможности
введенной в версии 2.0. Объект представления имеет тип [[yii\web\View]], который представляет собой часть *представление* в
шаблоне проектирования MVC. Если вы хотите получить доступ к контроллеру или виджету, то используйте выражение `$this->context`.
Для рендеринга частичных представлений, теперь исользуется метод `$this->render()`, а не `$this->renderPartial()`.
Результат вызова метода `render` теперь должен быть выведен напрямую, т. к `render` возвращает результат рендеринга, а не
отображает его сразу. Например,
```php
echo $this->render('_item', ['item' => $item]);
```
Кроме использования PHP в качестве основного шаблонизатора, Yii 2.0 также включает официальные расширения для основных популярных
шаблонизаторов: Smarty и Twig. Шаблонизатор Prado больше не поддерживается. Для использования данных шаблонизаторов, вам необходимо
настроить компонент приложения `view` с помощью указания свойств [[yii\base\View::$renderers|View::$renderers]].
Более детальная информация представлена в разделе [Шаблонизаторы](tutorial-template-engines.md).
Модели
------
Yii 2.0 использует основной класс [[yii\base\Model]] для моделей, аналогичный классу `CModel` в версии 1.1.
Класс `CFormModel` более не поддерживается. Вместо этого, для создания модели формы в Yii 2.0 вы должны
напрямую наследоваться от класса [[yii\base\Model]].
В Yii 2.0 появился новый метод [[yii\base\Model::scenarios()|scenarios()]] для объявления поддерживаемых сценариев,
и для обозначения в каком сценарии атрибуты должны проверяться, считаться безопасными и т. п. Например,
```php
public function scenarios()
{
return [
'backend' => ['email', 'role'],
'frontend' => ['email', '!name'],
];
}
```
В примере выше, объявлено два сценария: `backend` и `frontend`. Для `backend` сценария, оба атрибута `email` и `role` являются
безопасными, и могут быть массово присвоены. Для сценария `frontend`, атрибут `email` может быть массово присвоен, а атрибут `role` нет.
Оба атрибута `email` и `role` должны быть проверены с помощью правил валидации.
Метод [[yii\base\Model::rules()|rules()]] по-прежнему используется для объявления правил валидации. Обратите внимание, что в связи с
появлением нового метода [[yii\base\Model::scenarios()|scenarios()]], больше не поддерживается валидатор `unsafe`.
В большинстве случаев вам не нужно переопределять метод [[yii\base\Model::scenarios()|scenarios()]], если метод [[yii\base\Model::rules()|rules()]]
полностью указывает все существующие сценарии, и если нет надобности в объявлении атрибутов небезопасными.
Более детальная информация представлена в разделе [Модели](structure-models.md).
Контроллеры
-----------
В качестве базового класса для контроллеров в Yii 2.0 используется [[yii\web\Controller]], аналогичный `CWebController` в Yii 1.1.
Базовым классом для всех действий является [[yii\base\Action]].
Одним из основных изменений является то, что действие контроллера теперь должно вернуть результат вместо того, чтобы
Yii 2.0 осуществляет жадную загрузку (eager loading) связи по другому, в отличие от версии 1.1. В частности, в версии 1.1 для
выбора данных из основной и связанной таблиц будет использован запрос JOIN. В Yii 2.0 будут выполнены два запроса без использования JOIN:
первый запрос возвращает данные для основной таблицы, а второй - для связанной, с помощью фильтрации по первичным ключами основной таблицы.
Вместо того, чтобы возвращать объекты [[yii\db\ActiveRecord|ActiveRecord]], вы можете использовать метод [[yii\db\ActiveQuery::asArray()|asArray()]]
при построении запроса, для выборки большого количества записей. Это заставит вернуть результат запроса в качестве массива, что
может существеннос снизить время, нужное ЦПУ и память, при большом количестве записей. Например:
```php
$customers = Customer::find()->asArray()->all();
```
Еще одно изменение связано с тем, что вы больше не можете определять значения по-умолчанию в качестве свойств.
Вы должны устанавить их в методе `init` вашего класса, если это требуется.
```php
public function init()
{
parent::init();
$this->status = self::STATUS_NEW;
}
```
Тажке в версии 1.1 были некоторые проблемы с переопределением конструктора ActiveRecord. Данные проблемы не присутствуют
в версии 2.0. Обратите внимание, что при добавлении параметров в конструктор, вам возможно понадобится переопределить метод
[[yii\db\ActiveRecord::instantiate()]]. Переопределение может не потребоваться, если параметры, передаваемые в конструктор будут
иметь значения по-умолчанию, например `null`.
Существует также множество других улучшений в ActiveRecord. Более детальная информация о конфигурация представлена в разделе [Active Record](db-active-record.md).
Компонент приложения `user`
---------------------------
Класс `CWebUser` в версии 1.1 теперь заменен классом [[yii\web\User]], а также больше не существует класса `CUserIdentity`.
Вместо этого, вы должны предоставить реализацию интерфейса [[yii\web\IdentityInterface]], что гораздо проще в использовании.
Более детальная информация представлена в разделах [Аутентификация](security-authentication.md), [Авторизация](security-authorization.md)
и [Шаблон приложения advanced](tutorial-advanced-app.md).
Разбор и генерация URL
----------------------
Работа с URL в Yii 2.0 аналогична той, что была в версии 1.1. Основное изменение заключается в том, что теперь
поддерживаются дополнительные параметры. Например, если у вас имеется правило, объявленное следующим образом, то
оно совпадет с `post/popular` и `post/1/popular`. В версии 1.1, вам пришлось бы использовать два правила, для получения
того же результата.
```php
[
'pattern' => 'post/<page:\d+>/<tag>',
'route' => 'post/index',
'defaults' => ['page' => 1],
]
```
Более детальная информация представлена в разделе [Разбор и генерация URL](runtime-url-handling.md).
Использование Yii 1.1 вместе с 2.x
----------------------------------
Информация об использовании кода для Yii 1.1 вместе с Yii 2.0 представлена в разделе [Одновременное использование Yii 1.1 и 2.0](extend-using-v1-v2.md).