Использование сценариев в Yii2?

Прочитал документацию несколько раз, облазил десятки статей, но так до конца и не понял указание правил для сценариев.
Есть AR User, там определяем сценарий
<?php
namespace common\models;

use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

class User extends ActiveRecord implements IdentityInterface
{
    const SCENARIO_REGISTRATION = 'registration';

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios[self::SCENARIO_REGISTRATION] = ['nickname', 'email', 'password'];
        return $scenarios;
    }

Есть Model прослойка RegistrationForm
<?php

namespace frontend\modules\account\models\forms;

use Yii;
use yii\base\Model;
use common\models\User;
use frontend\modules\account\models\Token;

class RegistrationForm extends Model
{
    public $nickname; // nickname user

    public $email; // email user

    public $password; //password user

     //....

    /**
     * Registration function
     * @return bool
     * @throws \Exception
     * @throws \yii\db\Exception
     */
    public function registration()
    {
        if (!$this->validate()) {
            return false;
        }

        $transaction = Yii::$app->db->beginTransaction();

        try {
            $user = new User();
            $user->scenario = User::SCENARIO_REGISTRATION;
            $user->attributes = $this->attributes;
            $user->email_confirm = User::EMAIL_NO_CONFIRM;
            $user->generatePassword($this->password);

           //.....
    }
}

В ней мы устанавливаем сценарий и присваиваем массово атрибуты.
Где мы должны при этом писать rules, в AR или Model (RegistrationForm). В документации как я понял это делается в AR, однако в некоторых расширениях rules присутствует и там и там, при этом идентичен, что соответственно ввело в тупик. Зачем? Почему? Как и где все таки прописывать правила валидации?
Помогите догнать суть.
  • Вопрос задан
  • 4668 просмотров
Решения вопроса 2
Lumore
@Lumore
Front-end developer
Форма наследуется от RegistrationForm, следовательно rules будут наследоваться от этой модели и валидироваться во view исходя от этих rules. Когда вы в контроллере вызываете метод save(), срабатывает сохранение модели User, и валидация происходит через rules этой модели.

Можете писать rules только в RegistrationForm, но тогда в другом месте вы не сможете использовать модель User напрямую, т.к. валидация внутри не прописана.
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Доброй ночи.
Вы наследуете RegistrationForm от Model и поэтому можете прописать в ней свои правила валидации, не привязанные к модели User.
Это будет более правильней и не надо будет заморачиваться с сценариями.
Сценарии понадобятся в том случае, например, если Вы захотите сделать отдельную модель User для админки. Тогда да, понадобятся сценарии.

p.s. Посмотрите модель SignupForm в шаблоне advanced, никакие сценарии там не используются. Они в данном случае лишние.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы