
1. В Yii2 всё строится на namespace. Namespace - это пространство имён, такая штука, введённая в PHP с версии 5.3.0. Изучите подробнее пространства имён. Они нужны для удобной организации работы в фреймворке - позволяют организованно обращаться к классам, избежать конфликта имён нашего кода и кода фреймворка и PHP; улучшить читаемость кода (один раз объявляем namespace и дальше используем короткое название, вместо полного пути до нужного класса).
2. Удалён префикс "C" из имён файлов. Теперь не надо писать CGridView, CListView и т.д., а просто GridView, ListView.
3. Подключение модулей в конфигеиспользуется параметр 'class'
'modules' => array( ... 'users' => array( 'class' => 'app\modules\users\Users' ), ... ),
4. Удобно использовать заданные алиасы для настройки путей к директориям "@app, @www, @wwwroot
". Или создать свои алиасы.
5. В модели введён метод scenarios(), для заания правил валидации для конкретных сценариев
public function scenarios() { return array( 'backend' => array('email', 'role'), 'frontend' => array('email', '!name'), ); }
6. Для обращения к модели не использовать ->model(), это убрали, и теперь работа с моделью происходит, как и с другим обычным классом:
MyModel::getAuthor();
7. В ActiveRecord убраны scopes(), они заменены на обычные методы AR модели и имеют следующий вид
public function active($query) { return $query->andWhere('status = ' . self::STATUS_ACTIVE); }
8. Изменены relations(). Теперь задаются в виде геттеров «hasOne()», «hasMany()»
public function getAuthor() { return $this->hasOne('app\modules\users\models\User', array('id' => 'author_id')); // Первый параметр – это у нас имя класса, с которым мы настраиваем связь. // Во втором параметре в виде массива задаётся имя удалённого PK ключа (id) и FK из текущей таблицы модели (author_id), которые связываются между собой }
9. События. Для того чтобы определить событие достаточно в нужном месте вызвать
«trigger()» функцию, а уже потом в нужном месте задать для события
обработчик.
Пример:
файл app\modules\users\models\User ... public function afterSave($insert) { // Создаём событие $event = new ModelEvent; $this->trigger(self::EVENT_NEW_USER, $event); parent::afterSave($insert); } ... файл app\modules\users\controllers\DefaultController ... public function actionSignup() { $model = new User(); $model->scenario = 'signup'; if ($model->load($_POST)) { if (!$this->module->activeAfterRegistration) // Задаём наш обработчик событий, для события [[EVENT_NEW_USER]] $model->on($model::EVENT_NEW_USER, array($this->module, 'onNewUser')); if ($model->save()) { Yii::$app->session->setFlash('success'); return Yii::$app->response->refresh(); } } else { echo $this->render('signup', array('model' => $model)); } } ...
10. View. Теперь проще называть видами, а не представлениями. В Yii2 появился новый класс, который отвечает за все виды
приложения, и который выполняет непосредственно вывод информации.
Теперь в view файлах переменная "$this" относится уже не к контроллеру, а именно к новому классу «yii\base\View».
Для того, чтобы вызвать определённую функцию контроллера или виджета, к
которому принадлежит представление, нужно обратится к методу: «context».
Пример:
// Файл app\modules\blogs\views\default\index // $this->context относится к файлу app\modules\blogs\controllers\DefaultController // Простой вызов параметра модуля, к которому относится контроллер из представления echo $this->context->module->recordsPerPage; // Результат 10 //Файл app\modules\comments\widgets\comments\views\index // $this->context относится к файлу app\modules\comments\widgets\comments\Comments if ($this->context->model['id'] == 10 ) {...}
11. Widgets.Виджеты были дополнены новыми методами, плюс теперь они должны быть непосредственно выведены через «echo».
Пример:
// Note that you have to "echo" the result to display it echo \yii\widgets\Menu::widget(array('items' => $items)); // Passing an array to initialize the object properties $form = \yii\widgets\ActiveForm::begin(array( 'options' => array('class' => 'form-horizontal'), 'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')), )); ... form inputs here ... \yii\widgets\ActiveForm::end();
12. Action Filters. Фильтры. В новой версии фильтры контроллеров реализованы в виде «behaviors».
public function behaviors() { return array( 'access' => array( 'class' => \yii\web\AccessControl::className(), 'rules' => array( // allow authenticated users array( 'allow' => true, 'actions' => array('login', 'signup', 'activation'), 'roles' => array('?') ), array( 'allow' => true, 'actions' => array('logout'), 'roles' => array('@') ), array( 'allow' => true, 'actions' => array('index', 'view'), 'roles' => array('guest') ), array( 'allow' => true, 'actions' => array('edit', 'delete'), 'roles' => array('@') ), // deny all - можно не писать, он по умолчанию всё запрещает array( 'allow' => false ) ) ) ); }
13. Active Form. Формы теперь создаются ещё быстрее и удобнее, за счёт ActiveField класса, который упрощает стиль написания кода.
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); echo $form->field($model, 'username')->textInput($model->isNewRecord ? array() : array('readonly' => true)); echo $form->field($model, 'email')->textInput(); if (!$model->isNewRecord) { if (Yii::$app->user->checkAccess('editProfile')) { echo $form->field($model, 'status')->dropDownList(array( User::STATUS_ACTIVE => 'Active', User::STATUS_INACTIVE => 'Inactive', User::STATUS_DELETED => 'Deleted' )); echo $form->field($model, 'role')->dropDownList(array( User::ROLE_USER => 'User', User::ROLE_ADMIN => 'Admin' )); } echo $form->field($model, 'oldpassword')->passwordInput(); } echo $form->field($model, 'password')->passwordInput(); echo $form->field($model, 'repassword')->passwordInput(); ?> <div class="form-actions"> <?php echo Html::submitButton($model->isNewRecord ? 'Register' : 'Update', array('class' => 'btn btn-primary')); ?> </div> <?php ActiveForm::end(); ?>
14. User и Identity. Работа с пользователями. Теперь осуществляется через класс «yii\web\User»
и интерфейс «yii\web\Identity», что более гибко в использовании.
Из-за этих изменений атрибуты пользователя можно получить через метод «identity» пользователя.
Пример:
echo Yii::$app->user->identity->username;
30 июня 2016, Обновления и релизы / Метки: основы
По мотивам – https://habrahabr.ru/post/185236/

