Alexander Makarov
10 years ago
1 changed files with 496 additions and 0 deletions
@ -0,0 +1,496 @@ |
|||||||
|
Обновление с версии 1.1 |
||||||
|
======================= |
||||||
|
|
||||||
|
Между версиями 1.1 и 2.0 существует много различий, так как Yii был полностью переписан для версии 2.0. |
||||||
|
Таким образом, обновление с версии 1.1 не является таким же тривиальным как обновление между минорными версиями. |
||||||
|
В данном руководстве по обновлению приведены основные различия между двумя версиями. |
||||||
|
|
||||||
|
Если прежде вы не использовали Yii 1.1, вы можете пропустить данный раздел и перейти к разделу [Начало работы][start-installation.md]. |
||||||
|
|
||||||
|
Также учтите, что Yii 2.0 включает больше нового функционала, чем тот, который будет описан здесь. Настоятельно рекомендуется, |
||||||
|
что вы прочтете все руководство, чтобы узнать какой функционал был добавлен. Возможно, что необходимый функционал, который |
||||||
|
вы до этого разрабатывали сами, теперь является частью фреймворка. |
||||||
|
|
||||||
|
|
||||||
|
Установка |
||||||
|
--------- |
||||||
|
|
||||||
|
Yii 2.0 полностью основан на [Composer](https://getcomposer.org/), который де факто является менеджером зависимостей для PHP. |
||||||
|
Установка фреймворка, также как и расширений, осуществляется через Composer. Более детальные сведения по установке Yii 2.0 |
||||||
|
приведены в разделе [Установка Yii](start-installation.md). Сведения о том, как создавать расширения для Yii 2.0 или адаптировать |
||||||
|
уже имеющиеся расширения для версии 1.1 под версию 2.0, приведены в разделе [Создание Расширений](extend-creating-extensions.md). |
||||||
|
|
||||||
|
|
||||||
|
Требования PHP |
||||||
|
-------------- |
||||||
|
|
||||||
|
Yii 2.0 использует PHP 5.4 или выше, который включает большое количество улучшений по сравнению с версией 5.2, которая использовалась |
||||||
|
Yii 1.1. Таким образом, существует много различий в языке, которые вы должны принимать во внимание. |
||||||
|
Ниже приведены основные изменения в PHP: |
||||||
|
|
||||||
|
- [Пространства имен](http://php.net/manual/ru/language.namespaces.php); |
||||||
|
- [Анонимные функции](http://php.net/manual/ru/functions.anonymous.php); |
||||||
|
- Использование короткого синтаксис для массивов: `[...элементы...]` вместо `array(...элементы...)`; |
||||||
|
- Использование сокращенных тегов `<?=` для вывода в файлах представлений. |
||||||
|
С версии PHP 5.4 данную возможность можно использовать не опасаясь; |
||||||
|
- [классы и интерфейсы SPL](http://php.net/manual/ru/book.spl.php); |
||||||
|
- [Позднее статическое связывание (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); |
||||||
|
- [Интернационализация (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]]. |
||||||
|
|
||||||
|
Одним из основных изменений является то, что действие контроллера теперь должно вернуть результат вместо того, чтобы |
||||||
|
напрямую выводить его: |
||||||
|
|
||||||
|
```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; |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Контроллеры](structure-controllers.md). |
||||||
|
|
||||||
|
|
||||||
|
Виджеты |
||||||
|
------- |
||||||
|
|
||||||
|
В 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(); |
||||||
|
``` |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Виджеты](structure-widgets.md). |
||||||
|
|
||||||
|
|
||||||
|
Темы |
||||||
|
---- |
||||||
|
|
||||||
|
В Yii 2.0 темы работают совершенно по-другому. Теперь они основанны на механизме сопоставления путей исходного файла |
||||||
|
представления с темизированным файлом. Например, если используется сопоставление путей `['/web/views' => '/web/themes/basic']`, |
||||||
|
то темизированная версия файла представления `/web/views/site/index.php` будет находится в `/web/themes/basic/site/index.php`. |
||||||
|
По этой причине, темы могут быть применены к любому файлу представления, даже к представлению, отрендеренному внутри контекста |
||||||
|
контроллера или виджета. Тажке, больше не существует компонента `CThemeManager`. Вместо этого, `theme` является конфигурируемым |
||||||
|
свойством компонента приложения `view`. |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Темизация](output-theming.md). |
||||||
|
|
||||||
|
|
||||||
|
Консольные приложения |
||||||
|
--------------------- |
||||||
|
|
||||||
|
Консольные приложения теперь организованы как контроллеры, аналогично веб приложениям. Консольные контроллеры |
||||||
|
должны быть унаследованы от класса [[yii\console\Controller]], аналогичного `CConsoleCommand` в версии 1.1. |
||||||
|
|
||||||
|
Для выполнения консольной команды, используйте `yii <маршрут>`, где `<маршрут>` это маршрут контроллера (например, `sitemap/index`). |
||||||
|
Дополнительные анонимные аргументы будут переданы в качестве параметров соответствующему действию контроллера, в то время как |
||||||
|
именованные аргументы будут переданы в соответствие с объявлениями в [[yii\console\Controller::options()]]. |
||||||
|
|
||||||
|
Yii 2.0 поддерживает автоматическую генерацию справочной информации из блоков комментариев. |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Консольные команды](tutorial-console.md). |
||||||
|
|
||||||
|
|
||||||
|
I18N |
||||||
|
---- |
||||||
|
|
||||||
|
В Yii 2.0 были убраны встроенные форматтеры времени и чисел, в пользу [PECL intl PHP расширения](http://pecl.php.net/package/intl). |
||||||
|
|
||||||
|
Перевод сообщений теперь осуществляется через компонент приложения `i18n`. Данный компонент управляет множеством |
||||||
|
исходных хранилищ сообщений, что позволяет вам использовать разные хранилища для исходных сообщений в зависимости |
||||||
|
от категории сообщения. |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Интернационализация](tutorial-i18n.md). |
||||||
|
|
||||||
|
|
||||||
|
Фильтры действий |
||||||
|
---------------- |
||||||
|
|
||||||
|
Фильтры действий теперь сделаны с помошью поведений. Для определения нового фильтра, унаследуйтесь от [[yii\base\ActionFilter]]. |
||||||
|
Для использования фильтра, прикрепите его к контроллеру в качестве поведения. Например, для использования фильтра [[yii\filters\AccessControl]], |
||||||
|
следует сделать следующее: |
||||||
|
|
||||||
|
```php |
||||||
|
public function behaviors() |
||||||
|
{ |
||||||
|
return [ |
||||||
|
'access' => [ |
||||||
|
'class' => 'yii\filters\AccessControl', |
||||||
|
'rules' => [ |
||||||
|
['allow' => true, 'actions' => ['admin'], 'roles' => ['@']], |
||||||
|
], |
||||||
|
], |
||||||
|
]; |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Фильтры](structure-filters.md). |
||||||
|
|
||||||
|
|
||||||
|
Ресурсы |
||||||
|
------- |
||||||
|
|
||||||
|
В Yii 2.0 представлена новая возможность *связка ресурсов*, которая заменяет концепт пакетов скриптов в Yii 1.1. |
||||||
|
|
||||||
|
Связка ресурсов - это коллекция файлов ресурсов (например, Javascript файлы, CSS файлы, файлы изображений, и т. п.) в |
||||||
|
определенной папке. Каждая связка ресурсов представлена классом, унаследованным от [[yii\web\AssetBundle]]. |
||||||
|
Связка ресурсов становится доступной через веб, с помощью регистрации ее методом [[yii\web\AssetBundle::register()]]. |
||||||
|
В отличие от Yii 1.1, страница, регистрирующая связку ресурсов, автоматически будет содержать ссылки на Javascript и CSS |
||||||
|
файлы, указанные в связке. |
||||||
|
|
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Ресурсы](structure-assets.md). |
||||||
|
|
||||||
|
|
||||||
|
Хелперы |
||||||
|
------- |
||||||
|
|
||||||
|
В Yii 2.0 включено много широко используемых статичных классов. |
||||||
|
|
||||||
|
* [[yii\helpers\Html]] |
||||||
|
* [[yii\helpers\ArrayHelper]] |
||||||
|
* [[yii\helpers\StringHelper]] |
||||||
|
* [[yii\helpers\FileHelper]] |
||||||
|
* [[yii\helpers\Json]] |
||||||
|
* [[yii\helpers\Security]] |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Хелперы](helper-overview.md). |
||||||
|
|
||||||
|
|
||||||
|
Формы |
||||||
|
----- |
||||||
|
|
||||||
|
Yii 2.0 вводит новое понятие *поле* для построения форм с помощью [[yii\widgets\ActiveForm]]. Поле - это |
||||||
|
контейнер, содержащий лейбл, поле ввода, сообщение об ошибке и/или вспомогательный текст. |
||||||
|
Поле представлено объектом [[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(); ?> |
||||||
|
``` |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Работа с формами](input-forms.md). |
||||||
|
|
||||||
|
|
||||||
|
Построитель запросов |
||||||
|
-------------------- |
||||||
|
|
||||||
|
В версии 1.1, построение запроса было разбросано среди нескольких классов, включая `CDbCommand`, |
||||||
|
`CDbCriteria`, и `CDbCommandBuilder`. В Yii 2.0 запрос к БД представлен в рамках объекта [[yii\db\Query|Query]], |
||||||
|
который может быть превращен в SQL выражение с помощью [[yii\db\QueryBuilder|QueryBuilder]]. Например, |
||||||
|
|
||||||
|
```php |
||||||
|
$query = new \yii\db\Query(); |
||||||
|
$query->select('id, name') |
||||||
|
->from('user') |
||||||
|
->limit(10); |
||||||
|
|
||||||
|
$command = $query->createCommand(); |
||||||
|
$sql = $command->sql; |
||||||
|
$rows = $command->queryAll(); |
||||||
|
``` |
||||||
|
|
||||||
|
Лучшим спосом использования данных методов является работа с [Active Record](db-active-record.md). |
||||||
|
|
||||||
|
Более детальная информация представлена в разделе [Построитель запросов](db-query-builder.md). |
||||||
|
|
||||||
|
|
||||||
|
Active Record |
||||||
|
------------- |
||||||
|
|
||||||
|
В Yii 2.0 внесено множество изменений в работу [Active Record](db-active-record.md). Два основных из них, включают в себя |
||||||
|
построение запросов и работу со связями. |
||||||
|
|
||||||
|
Класс `CDbCriteria` в версии 1.1 был заменен [[yii\db\ActiveQuery]] в Yii 2.0. Этот класс наследуется от [[yii\db\Query]] и таким |
||||||
|
образом получает все методы необходимые для построения запроса. Для построения запроса вам следует вызвать метод [[yii\db\ActiveRecord::find()]]: |
||||||
|
|
||||||
|
```php |
||||||
|
// Получаем всех *активных* клиентов и сортируем их по ID |
||||||
|
$customers = Customer::find() |
||||||
|
->where(['status' => $active]) |
||||||
|
->orderBy('id') |
||||||
|
->all(); |
||||||
|
``` |
||||||
|
|
||||||
|
Для объявления связи следует просто объявить геттер, который возвращает объект [[yii\db\ActiveQuery|ActiveQuery]]. |
||||||
|
Имя свойства, определенное геттером представляет собой название связи. Например, следующий код объявляет связь |
||||||
|
`orders` (в версии 1.1, вам нужно было бы объявить связи в одном центральном месте - `relations()`): |
||||||
|
|
||||||
|
```php |
||||||
|
class Customer extends \yii\db\ActiveRecord |
||||||
|
{ |
||||||
|
public function getOrders() |
||||||
|
{ |
||||||
|
return $this->hasMany('Order', ['customer_id' => 'id']); |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
Теперь вы можете использовать выражение `$customer->orders` для получения всех заказов клиента из связанной таблицы. Вы также |
||||||
|
можете использовать следующий код, чтобы применить нужные условия "на лету": |
||||||
|
|
||||||
|
```php |
||||||
|
$orders = $customer->getOrders()->andWhere('status=1')->all(); |
||||||
|
``` |
||||||
|
|
||||||
|
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). |
Loading…
Reference in new issue