Registration - uniqcle/Yii2 GitHub Wiki

В инициализирующей миграции console\migrations\*_init.php создается таблица user.

При необходимости на основе ее создаем таблицу user (если ранее не была создана).

Удаляем

common\models\LoginForm.php
common\models\User.php

frontend\config\main.php
...
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
        ],
...

frontend\models\SignupForm.php
frontend\models\ResetPasswordForm.php
frontend\models\PasswordResetRequestForm.php

controllers\SiteController.php
...
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout', 'signup'],
                'rules' => [
                    [
                        'actions' => ['signup'],
                        'allow' => true,
                        'roles' => ['?'],
                    ],
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
...
+
actionLogin()
actionLogout()
actionSignup()
actionRequestPasswordReset()
actionResetPassword($token)
actionVerifyEmail($token)
actionResendVerificationEmail()

views\site\login.php
views\site\requestPasswordResetToken.php
views\site\resendVerificationEmail.php
views\site\resetPassword.php
views\site\signup.php

При возникновении ошибки User::identityClass must be set в frontend\views\layouts\main.php комментируем блок

...
if (Yii::$app->user->isGuest) {
        $menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
        $menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
    } else {
        $menuItems[] = '<li>'
            . Html::beginForm(['/site/logout'], 'post')
            . Html::submitButton(
                'Logout (' . Yii::$app->user->identity->username . ')',
                ['class' => 'btn btn-link logout']
            )
            . Html::endForm()
            . '</li>';
    }
...

Registration

frontend\controllers\UserController.php

namespace frontend\controllers;

use Yii; 
use frontend\models\forms\SignupForm; 

class UserController extends \yii\web\Controller
{

    public function actionSignup()
    {

    	$model = new SignupForm(); 

    	if( $model->load( Yii::$app->request->post() ) && $model->save() ){

    		Yii::$app->session->setFlash('success', 'User Succefull Registered!'); 

    		return $this->redirect(['site/index']); 
    	}

        return $this->render('signup', [
        	'model' => $model
        ]);
    }


    public function actionLogin()
    {
        return $this->render('login');
    }

}

frontend\models\forms\SignupForm.php

namespace frontend\models\forms; 

use Yii; 
use yii\base\Model; 
use frontend\models\User; 

class SignupForm extends Model
{
	public $username; 
	public $email; 
	public $password; 

	public function rules(){
		return [
			['username', 'trim'], 
			['username', 'required'], 
			['username', 'string', 'min' => 2, 'max' => 255], 
                        ['username', 'unique', 'targetClass' => User::className() ],

			['email', 'trim'], 
			['email', 'required'], 
			['email', 'email'], 
			['email', 'string', 'min' => 2, 'max' => 255], 
			['email', 'unique', 'targetClass' => User::className() ], //Обращаемся к классу User для проврки уникальности email в БД

			['password', 'required'], 
			['password', 'string', 'min' => 6]
		]; 
	}

	public function save(){

		if( $this->validate() ){

			$user = new User(); 

			$user->username      = $this->username; 
			$user->email         = $this->email; 
			$user->created_at    = $time = time(); 
			$user->updated_at    = $time; 
			$user->auth_key      = Yii::$app->security->generateRandomString(); 
			$user->password_hash = Yii::$app->security->generatePasswordHash( $this->password ); 

			return $user->save(); 
		} 

		return false; 
	}

}

frontend\views\user\signup.php

Можно взять отсюда frontend/views/site/signup.php

/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model \frontend\models\SignupForm */
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
$this->title = 'Signup';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-signup">
    <h1><?= Html::encode($this->title) ?></h1>

    <p>Please fill out the following fields to signup:</p>

    <div class="row">
        <div class="col-lg-5">
            <?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>

                <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>

                <?= $form->field($model, 'email') ?>

                <?= $form->field($model, 'password')->passwordInput() ?>

                <div class="form-group">
                    <?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
                </div>

            <?php ActiveForm::end(); ?>
        </div>
    </div>
</div>

frontend\models\User.php

namespace frontend\models;

use Yii;

/**
 * This is the model class for table "user".
 *
 * @property int $id
 * @property string $username
 * @property string $auth_key
 * @property string $password_hash
 * @property string $password_reset_token
 * @property string $email
 * @property int $status
 * @property int $created_at
 * @property int $updated_at
 */
class User extends \yii\db\ActiveRecord
{

    public static function tableName()
    {
        return 'user';
    }

    //Удаляем валидацию данных, чтоб не использовать сценарии. 
    //Лучше использовать правила валидации на стороне модели ФОРМ. 

}
⚠️ **GitHub.com Fallback** ⚠️