intro-upgrade-from-v1.md 32.4 KB
Newer Older
1
Обновление с версии 1.1
2
====================
3 4 5

Между версиями 1.1 и 2.0 существует много различий, так как Yii был полностью переписан для версии 2.0.
Таким образом, обновление с версии 1.1 не является таким же тривиальным как обновление между минорными версиями.
6
В данном руководстве приведены основные различия между двумя версиями.
7

8
Если прежде вы не использовали Yii 1.1, вы можете сразу перейти к разделу «[Начало работы][start-installation.md]».
9

10 11 12
Также учтите, что в Yii 2.0 гораздо больше новых возможностей, чем описано далее. Настоятельно рекомендуется, изучить
всё руководство. Вполне возможно, что то, что раньше приходилось разрабатывать самостоятельно теперь является частью
фреймворка.
13 14


Mark committed
15
Установка
16
--------
17

18 19 20 21
Yii 2.0 широко использует [Composer](https://getcomposer.org/), который является основным менеджером зависимостей для PHP.
Установка как фреймворка, так и расширений, осуществляется через Composer. Подробно о установке Yii 2.0 вы можете узнать
из раздела «[Установка Yii](start-installation.md)». О том, как создавать расширения для Yii 2.0 или адаптировать
уже имеющиеся расширения от версии 1.1, вы можете узнать из раздела «[Создание расширений](extend-creating-extensions.md)».
22 23 24


Требования PHP
25
-------------
26

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

31
- [Пространства имён](http://php.net/manual/ru/language.namespaces.php);
32
- [Анонимные функции](http://php.net/manual/ru/functions.anonymous.php);
33 34 35 36
- Использование короткого синтаксиса для массивов: `[...элементы...]` вместо `array(...элементы...)`;
- Использование короткого echo `<?=` для вывода в файлах представлений. С версии PHP 5.4 данную возможность можно
  использовать не опасаясь;
- [Классы и интерфейсы SPL](http://php.net/manual/ru/book.spl.php);
37 38 39
- [Позднее статическое связывание (LSB)](http://php.net/manual/ru/language.oop5.late-static-bindings.php);
- [Классы для дат и времени](http://php.net/manual/ru/book.datetime.php);
- [Трейты](http://php.net/manual/ru/language.oop5.traits.php);
40
- [Интернационализация (intl)](http://php.net/manual/ru/book.intl.php); Yii 2.0 использует расширение PHP `intl`
41 42 43
  для различного функционала интернационализации.


44 45 46 47 48 49 50
Пространства имён
---------------

Одним из основных изменений в Yii 2.0 является использование пространств имён. Почти каждый класс фреймворка
находится в пространстве имён, например, `yii\web\Request`. Префикс "С" в именах классов больше не используется.
Имена классов соответствуют структуре директорий. Например, `yii\web\Request` указывает, что соответсвующий класс
находится в файле `web/Request.php` в директории фреймворка.
51

52 53
Благодаря загрузчику классов Yii, вы можете использовать любой класс фреймворка без необходимости непосредственно
подключать его.
54 55


56 57
Компонент и объект
----------------
58

59 60 61 62
В 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).
63

64 65
Если вашему классу не нужны события или поведения, вы можете использовать [[yii\base\Object|Object]] в качестве
базового класса. В основном это относится к классам, представляющим собой базовые структуры данных.
66 67 68


Конфигурация объекта
69 70 71 72 73
------------------

Класс [[yii\base\Object|Object]] предоставляет единый способ конфигурирования объектов. Любой дочерний класс
[[yii\base\Object|Object]] может определить конструктор (если нужно) как показано ниже. Это позволит конфигурировать
его универсально:
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108


```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]);
```

109
Более подробная информация о конфигурации представлена в разделе «[Настройки](concept-configurations.md)».
110 111 112 113 114


События
-------

115 116
В Yii 1, события создавались с помощью объявления метода `on` (например, `onBeforeSave`). В Yii2 вы можете использовать
любое имя события. Вызывать события можно при помощи метода [[yii\base\Component::trigger()|trigger()]].
117 118 119 120 121 122 123 124 125 126

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

Для прикрепления обработчика события используйте метод [[yii\base\Component::on()|on()]].

```php
$component->on($eventName, $handler);
127
// убираем обработчик
128 129 130
// $component->off($eventName, $handler);
```

131
Есть и другие улучшения по части событий, подробно описанные в в разделе «[События](concept-events.md)».
132 133 134


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

137 138 139 140 141
В Yii 2.0 псевдонимы используются более широко и применяются как к путям в файловой системе, так и к URL. Теперь, для
того, чтобы отличать псевдонимы от обычных путей и URL, требуется, чтобы имя псевдонима начиналось с символа `@`.
Например, псевдоним `@yii` соответствует директории, в которую установлен Yii. Псевдонимы пути используются во многих
местах. Например, значение свойства [[yii\caching\FileCache::cachePath]] может быть как псевдонимом пути так и
обычным путём к папке.
142

143 144 145 146 147 148
Псевдонимы пути тесно связаны с пространством имён классов. Рекомендуется определять псевдоним пути для каждого корневого
пространства имён, что позволяет использовать загрузчик классов Yii без какой-либо дополнительной настройки. Например,
так как `@yii` соответствует директории, в которую установлен фреймворк, класс `yii\webRequest` может быть загружен
автоматически. Если вы используете сторонние библиотеки, например, из Zend Framework, вы можете определить псевдоним
пути `@Zend` как директорию, в которую установлен этот фреймворк. После этого Yii будет способен автоматически загружать
любой класс Zend Framework.
149

150
Подробнее о псевдонимах пути можно узнать из раздела «[Псевдонимы пути](concept-aliases.md)».
151 152 153


Представления
154
-----------
155

156
Одним из основных изменений в Yii 2 является то, что специальная переменная `$this` в представлении, больше не соответствует
157
текущему контроллеру или виджету. Вместо этого, `$this` теперь соответствует объекту *представления*, новой возможности
158 159
введённой в версии 2.0. Объект представления имеет тип [[yii\web\View]], который представляет собой часть *view* в
шаблоне проектирования MVC. Если вы хотите получить доступ к контроллеру или виджету, используйте выражение `$this->context`.
160

161 162 163
Для рендеринга частичных представлений теперь используется метод `$this->render()`, а не `$this->renderPartial()`.
Результат вызова метода `render` теперь должен быть выведен напрямую, так как `render` возвращает результат рендеринга,
а не отображает его сразу:
164 165 166 167 168

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

169 170 171 172
Кроме использования PHP в качестве основного шаблонизатора, Yii 2.0 также предоставляет официальные расширения для двух
популярных шаблонизаторов: Smarty и Twig. Шаблонизатор Prado больше не поддерживается. Для использования данных
шаблонизаторов необходимо настроить компонент приложения `view` задав свойство [[yii\base\View::$renderers|View::$renderers]].
Подробнее об этом можно прочитать в разделе «[Шаблонизаторы](tutorial-template-engines.md)».
173 174 175 176

Модели
------

177 178
Yii 2.0 использует в качестве базового класса для моделей [[yii\base\Model]], аналогичный классу `CModel` в версии 1.1.
Класс `CFormModel` удалён. Вместо него для создания модели формы в Yii 2.0 вы должны напрямую наследоваться от [[yii\base\Model]].
179

180 181
Появился новый метод [[yii\base\Model::scenarios()|scenarios()]] для объявления поддерживаемых сценариев,
и для обозначения в каком сценарии атрибуты должны проверяться, считаться безопасными и т.п. Например,
182 183 184 185 186 187

```php
public function scenarios()
{
    return [
        'backend' => ['email', 'role'],
188
        'frontend' => ['email', '!role'],
189 190 191 192 193 194 195 196 197 198 199 200 201 202
    ];
}
```

В примере выше, объявлено два сценария: `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()]]
полностью указывает все существующие сценарии, и если нет надобности в объявлении атрибутов небезопасными.

203
Более детальная информация представлена в разделе «[Модели](structure-models.md)».
204 205 206 207 208


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

209 210
В качестве базового класса для контроллеров в Yii 2.0 используется [[yii\web\Controller]], аналогичный `CWebController`
в Yii 1.1. Базовым классом для всех действий является [[yii\base\Action]].
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226

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

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

227
Более детальная информация представлена в разделе «[Контроллеры](structure-controllers.md)».
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254


Виджеты
-------

В Yii 2.0 класс [[yii\base\Widget]] используется в качестве базового класса для виджетов, аналогично `CWidget` в Yii 1.1.

Для лучшей поддержки фреймворка в IDE, Yii 2.0 использует новый синтаксис для виджетов. Новые статические методы 
[[yii\base\Widget::begin()|begin()]], [[yii\base\Widget::end()|end()]], и [[yii\base\Widget::widget()|widget()]]
используются следующим образом:

```php
use yii\widgets\Menu;
use yii\widgets\ActiveForm;

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

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

255
Более детальная информация представлена в разделе «[Виджеты](structure-widgets.md)».
256 257 258 259 260


Темы
----

yupe committed
261
В Yii 2.0 темы работают совершенно по-другому. Теперь они основаны на механизме сопоставления путей исходного файла
262 263
представления с темизированным файлом. Например, если используется сопоставление путей `['/web/views' => '/web/themes/basic']`,
то темизированная версия файла представления `/web/views/site/index.php` будет находится в `/web/themes/basic/site/index.php`.
264
По этой причине темы могут быть применены к любому файлу представления, даже к представлению, отрендеренному внутри контекста
yupe committed
265
контроллера или виджета. Также, больше не существует компонента `CThemeManager`. Вместо этого, `theme` является конфигурируемым
266 267
свойством компонента приложения `view`.

268
Более детальная информация представлена в разделе «[Темизация](output-theming.md)».
269 270 271 272 273 274 275 276 277 278 279 280 281 282


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

Консольные приложения теперь организованы как контроллеры, аналогично веб приложениям. Консольные контроллеры
должны быть унаследованы от класса [[yii\console\Controller]], аналогичного `CConsoleCommand` в версии 1.1.

Для выполнения консольной команды, используйте `yii <маршрут>`, где `<маршрут>` это маршрут контроллера (например, `sitemap/index`).
Дополнительные анонимные аргументы будут переданы в качестве параметров соответствующему действию контроллера, в то время как
именованные аргументы будут переданы в соответствие с объявлениями в [[yii\console\Controller::options()]].

Yii 2.0 поддерживает автоматическую генерацию справочной информации из блоков комментариев.

283
Более детальная информация представлена в разделе «[Консольные команды](tutorial-console.md)».
284 285 286 287 288


I18N
----

289
В Yii 2.0 встроенные форматтеры времени и чисел были убраны в пользу [PECL расширения PHP intl](http://pecl.php.net/package/intl).
290 291 292 293 294

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

295
Более детальная информация представлена в разделе «[Интернационализация](tutorial-i18n.md)».
296 297 298 299 300


Фильтры действий
----------------

yupe committed
301
Фильтры действий теперь сделаны с помощью поведений. Для определения нового фильтра, унаследуйтесь от [[yii\base\ActionFilter]].
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
Для использования фильтра, прикрепите его к контроллеру в качестве поведения. Например, для использования фильтра [[yii\filters\AccessControl]],
следует сделать следующее:

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

319
Более детальная информация представлена в разделе «[Фильтры](structure-filters.md)».
320 321 322 323 324 325 326


Ресурсы
-------

В Yii 2.0 представлена новая возможность *связка ресурсов*, которая заменяет концепт пакетов скриптов в Yii 1.1.

327 328 329 330
Связка ресурсов — это коллекция файлов ресурсов (например, JavaScript файлы, CSS файлы, файлы изображений, и т.п.) в
определенной директории. Каждая связка ресурсов представлена классом, унаследованным от [[yii\web\AssetBundle]].
Связка ресурсов становится доступной через веб после её регистрации методом [[yii\web\AssetBundle::register()]].
В отличие от Yii 1.1, страница, регистрирующая связку ресурсов, автоматически будет содержать ссылки на JavaScript и CSS
331 332 333
файлы, указанные в связке.


334
Более детальная информация представлена в разделе «[Ресурсы](structure-assets.md)».
335 336 337 338 339 340 341 342 343 344 345 346 347


Хелперы
-------

В Yii 2.0 включено много широко используемых статичных классов.

* [[yii\helpers\Html]]
* [[yii\helpers\ArrayHelper]]
* [[yii\helpers\StringHelper]]
* [[yii\helpers\FileHelper]]
* [[yii\helpers\Json]]

348
Более детальная информация представлена в разделе «[Хелперы](helper-overview.md)».
349 350 351 352 353


Формы
-----

354 355
Yii 2.0 вводит новое понятие *поле* для построения форм с помощью [[yii\widgets\ActiveForm]]. Поле — это
контейнер, содержащий подпись, поле ввода, сообщение об ошибке и/или вспомогательный текст.
356 357 358 359 360 361 362 363 364 365 366 367 368
Поле представлено объектом [[yii\widgets\ActiveField|ActiveField]]. Используя поля, вы можете строить
формы гораздо проще чем это было раньше:

```php
<?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(); ?>
```

369
Более детальная информация представлена в разделе «[Работа с формами](input-forms.md)».
370 371 372 373 374 375 376


Построитель запросов
--------------------

В версии 1.1, построение запроса было разбросано среди нескольких классов, включая `CDbCommand`,
`CDbCriteria`, и `CDbCommandBuilder`. В Yii 2.0 запрос к БД представлен в рамках объекта [[yii\db\Query|Query]],
377
который может быть превращён в SQL выражение с помощью [[yii\db\QueryBuilder|QueryBuilder]]. Например,
378 379 380 381 382 383 384 385 386 387 388 389

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

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

390
Лучшим способом использования данных методов является работа с [Active Record](db-active-record.md).
391

392
Более детальная информация представлена в разделе «[Построитель запросов](db-query-builder.md)».
393 394 395 396 397


Active Record
-------------

398
В Yii 2.0 внесено множество изменений в работу [Active Record](db-active-record.md). Два основных из них включают в себя
399 400
построение запросов и работу со связями.

401 402 403
Класс `CDbCriteria` версии 1.1 был заменен [[yii\db\ActiveQuery]]. Этот класс наследуется от [[yii\db\Query]] и таким
образом получает все методы, необходимые для построения запроса. Чтобы начать строить запрос следует вызвать метод
[[yii\db\ActiveRecord::find()]]:
404 405 406 407 408 409 410 411 412 413

```php
// Получаем всех *активных* клиентов и сортируем их по ID
$customers = Customer::find()
    ->where(['status' => $active])
    ->orderBy('id')
    ->all();
```

Для объявления связи следует просто объявить геттер, который возвращает объект [[yii\db\ActiveQuery|ActiveQuery]].
414 415
Имя свойства, определённое геттером, представляет собой название связи. Например, следующий код объявляет связь
`orders` (в версии 1.1, вам нужно было бы объявить связи в одном месте — методе `relations()`):
416 417 418 419 420 421 422 423 424 425 426 427

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

Теперь вы можете использовать выражение `$customer->orders` для получения всех заказов клиента из связанной таблицы. Вы также
428
можете использовать следующий код, чтобы применить нужные условия «на лету»:
429 430 431 432 433

```php
$orders = $customer->getOrders()->andWhere('status=1')->all();
```

434 435 436 437
Yii 2.0 осуществляет жадную загрузку связи не так, как это было в 1.1. В частности, в версии 1.1 для выбора данных из
основной и связанной таблиц будет использован запрос JOIN. В Yii 2.0 будут выполнены два запроса без использования JOIN:
первый запрос возвращает данные для основной таблицы, а второй, осуществляющий фильтрацию по первичным ключами основной
таблицы — для связанной.
438

439 440 441 442
Вместо того, чтобы при выборке большого количества записей возвращать объекты [[yii\db\ActiveRecord|ActiveRecord]], вы
можете использовать в построении запроса метод [[yii\db\ActiveQuery::asArray()|asArray()]]. Это заставит вернуть
результат запроса в виде массива, что при большом количестве записей может существенно снизить затрачиваемое процессорное
время и объём потребляемой памяти. Например:
443 444 445 446 447

```php
$customers = Customer::find()->asArray()->all();
```

448
Ещё одно изменение связано с тем, что вы больше не можете определять значения по-умолчанию через public свойства.
yupe committed
449
Вы должны установить их в методе `init` вашего класса, если это требуется.
450 451 452 453 454 455 456 457 458

```php
public function init()
{
    parent::init();
    $this->status = self::STATUS_NEW;
}
```

459 460 461 462 463 464
Также в версии 1.1 были некоторые проблемы с переопределением конструктора ActiveRecord. Данные проблемы отсутствуют
в версии 2.0. Обратите внимание, что при добавлении параметров в конструктор, вам, возможно, понадобится переопределить метод
[[yii\db\ActiveRecord::instantiate()]].

Существует также множество других улучшений в ActiveRecord. Подробнее о них можно узнать в разделе
«[Active Record](db-active-record.md)».
465

466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495
Поведения Active Record
-----------------------

В версии 2.0 отсутствует базовый класс для поведений `CActiveRecordBehavior`. Если вам необходимо создать поведение для
Active Record, стоит наследовать его класс напрямую от `yii\base\Behavior`. Если поведение должно реагировать на какие-либо
события, необходимо перекрыть метод `events()` следующим образом:

```php
namespace app\components;

use yii\db\ActiveRecord;
use yii\base\Behavior;

class MyBehavior extends Behavior
{
    // ...

    public function events()
    {
        return [
            ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
        ];
    }

    public function beforeValidate($event)
    {
        // ...
    }
}
```
496 497


498
User и IdentityInterface
499 500
---------------------------

501 502 503
Класс `CWebUser` из версии 1.1 теперь заменён классом [[yii\web\User]]. Также больше не существует класса `CUserIdentity`.
Вы должны реализовать интерфейс [[yii\web\IdentityInterface]], что гораздо проще. Пример реализации представлен в шаблоне
приложения advanced.
504

505 506
Более подробная информация представлена в разделах «[Аутентификация](security-authentication.md)»,
«[Авторизация](security-authorization.md)» и «[Шаблон приложения advanced](tutorial-advanced-app.md)».
507 508 509 510 511 512 513


Разбор и генерация URL
----------------------

Работа с URL в Yii 2.0 аналогична той, что была в версии 1.1. Основное изменение заключается в том, что теперь
поддерживаются дополнительные параметры. Например, если у вас имеется правило, объявленное следующим образом, то
514
оно совпадет с `post/popular` и `post/1/popular`. В версии 1.1, вам пришлось бы использовать два правила, для достижения
515 516 517 518 519 520 521 522 523 524
того же результата.

```php
[
    'pattern' => 'post/<page:\d+>/<tag>',
    'route' => 'post/index',
    'defaults' => ['page' => 1],
]
```

525
Более детальная информация представлена в разделе «[Разбор и генерация URL](runtime-url-handling.md)».
526 527 528 529

Использование Yii 1.1 вместе с 2.x
----------------------------------

530 531
Информация об использовании кода для Yii 1.1 вместе с Yii 2.0 представлена в разделе
«[Одновременное использование Yii 1.1 и 2.0](extend-using-v1-v2.md)».