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>';
}
...
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';
}
//Удаляем валидацию данных, чтоб не использовать сценарии.
//Лучше использовать правила валидации на стороне модели ФОРМ.
}