Обновления и релизы

Yii2. Основные моменты

Отличия и улучшения в Yii2 по сравнению с Yii1. С развитием фреймворка жизнь становится интересней

Yii2. Основные моменты

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/