ثبت نام کاربر

[right][font="Arial Black"]

سلام دوستان

یه ثبت نام کاربر ساده نوشتم میخواستم ببینم استانداردهای

mvc را رعایت کرده ام یا

اگه مشکلی بود خوشحال میشم بگید

[/font][/right]




<?php


namespace app\controllers;


use app\models\Users;

use Yii;


class UsersController extends \yii\web\Controller {


    public function actionIndex() {

        return $this->render('index');

    }


    public function actionRegister() {


        $user = new Users();

        if ($user->load(Yii::$app->request->post()) && $user->validate()) {

           // $values = \Yii::$app->request->post();

            $user->register_user();

            return $this->refresh();

        } else {

            return $this->render('index', ['model' => $user]);

        }

    }


}







<?php


namespace app\models;


use Yii;


/**

 * This is the model class for table "{{%shop_users}}".

 *

 * @property integer $id

 * @property string $fname

 * @property string $email

 * @property string $user

 * @property string $pass

 * @property integer $phone

 * @property string $address

 * @property string $codemeli

 * @property string $image

 * @property integer $type

 */

class Users extends \yii\db\ActiveRecord {


    /**

     * @inheritdoc

     */

    public static function tableName() {

        return '{{%shop_users}}';

    }


    /**

     * @inheritdoc

     */

    public function rules() {

        return [

            [['fname', 'email', 'user', 'pass', 'type', 'lname'], 'required', 'message' => '{attribute} نباید خالی باشد'],

            [['phone', 'type'], 'integer'],

            [['address'], 'string'],

            [['fname', 'email', 'user'], 'string', 'max' => 255],

            [['pass'], 'string', 'max' => 125],

            [['codemeli'], 'string', 'max' => 10],

            [['image'], 'string', 'max' => 500],

            [['email'], 'email', 'message' => 'ادرس ایمیل معتبر وارد کنید'],

            [['email'], 'unique', 'message' => '{attribute}  تکراری میباشد'],

                //[['email'], 'unique', 'message' => 'ین ایمیل قبلا ثبت شده است ']

        ];

    }


    /**

     * @inheritdoc

     */

    public function attributeLabels() {

        return [

            'id' => Yii::t('app', 'شناسه کاربر'),

            'fname' => Yii::t('app', 'نام '),

            'email' => Yii::t('app', 'ادرس ایمیل'),

            'user' => Yii::t('app', 'نام کاربری'),

            'pass' => Yii::t('app', 'رمز عبور'),

            'phone' => Yii::t('app', 'شماره همراه'),

            'address' => Yii::t('app', 'ادرس'),

            'codemeli' => Yii::t('app', 'کد ملی'),

            'image' => Yii::t('app', 'عکس'),

            'type' => Yii::t('app', 'جنسیت'),

            'lname' => Yii::t('app', 'نام خانوادگی'),

        ];

    }


    public function register_user() {


        if ($this->validate()) {

            $this->save();

            \Yii::$app->session->setFlash('user_register');

            return 1;

        } else {

            \Yii::$app->session->setFlash('user_not_register');

            return -1;

        }

    }


}







<?php

/* @var $this yii\web\View */


use yii\bootstrap\ActiveForm;

use yii\helpers\Html;

?>

<div class="row">

    <div class="col-lg-6" >

        <?php if (Yii::$app->session->hasFlash('user_not_register')) { ?>

            <div class="alert alert-danger">

                ثبت نام شما انجام نشد لطفا دوباره تلاش کنید.

            </div>

        <?php } ?>

        <?php if (Yii::$app->session->hasFlash('user_register')) { ?>

            <div class="alert alert-success">

                ثبت نام شما با موفقیت انجام شد.

            </div>

        <?php } ?>

        <div class="well">

            <?php $form = yii\widgets\ActiveForm::begin() ?>


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

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

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

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

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

            <?= $form->field($model, 'type')->radioList(['0' => 'مرد', '1' => 'زن'], ['prompt' => ' انتخاب کنید']) ?>

            <?= "<div align ='left'>" . \yii\bootstrap\Html::submitButton('ثبت نام', ['class' => 'btn btn-success']) . "</div>" ?>

            <?php $form->end(); ?>

        </div>

        <?php ?>

    </div>

</div>




[size="4"][right]بهتر است که یک مدل خودش را تغییر وضعیت ندهد. چون باعث تکرار بعضی چیزها میشه و کلا تغییر وضعیت ماهیت دستوری دارد که بر عهده کنترلر است. البته مدل میتواند یک مدل دیگر را تغییر وضعیت دهد و ایرادی ندارد. اما تغییر وضعیت یک مدل توسط خودش هم خوانایی را کم میکند و استفاده مجدد را. بعضا هم موجب عذاب وجدان برنامه نویس و کابوسهای شبانه میشود

شما مدل را در خودش تغییر وضعیت داده اید یعنی

$this->save()

را داخل خود مدل صدا زده اید

همین هم باعث شده

validate()

را دوبار صدا بزنید یعنی یکبار در کنترلر و یکبار در خود مدل

ضمن اینکه خود

save()

هم یکبار

validate()

را صدا میزند که میشود 3 بار

یعنی اگر من جای شما بودم دستور ذخیره را به داخل کنترلر میکشوندم و همونجا به قتل میرسوندمش.

پس همانطور که ملاحظه میکنید کاری که مدل با خودش کرده چه پیامدهای ددمنشیانه ای میتونه داشته باشه

البته اگر از بزرگان کسی آکادیمکتر میتونه این بحث را ادامه بده من شخصا ازش تشکر میکنم.[/right][/size]

[right]

[font="Arial Narrow"]

سلام اقای نراقی

ممنون بابت وقتی که گذاشتید

داخل مدل به نظر خودمم هم جالب نیست باید حذف شود validate بله اون

قبلا استاندارد کد نویسی رو رعایت نمیکردم میخوام بدونم از لحاظ استاندارد معماری سه لایه

ما اطلاعات رو از کاربر میگیریم در داخل کنترلر بررسی میکنیم و صحت اطلاعات که تایید شد به مدل فرستاده میشود تا بقیه مثل ذخیره، بروزرسانی و کارهای دیگر انجام شود

و اینکه در این فریم ورک برای کارهای کاربران باید از همین مدل استفاده کرد یا یک مدل جدید ایجاد کنم

ممنون

[/font][/right]

[size="4"][right]سلام

بله حرفتون در مورد معماری سه لایه درسته با این تفاوت که پیاده سازی عملیات در مدل باید انجام شود از جمله عملیات "تغییر وضعیت" که در مورد مثال شما بدنه تابع

save()

اینکار را میکند.

ولی

دستور تغییر وضعیت باید از کنترلر صادر شود

در اینجا

save()

در داخل کنترل باید صدا زده شود.

برای درک بهتر این مسئله میتوانید مدل ها و کنترلرهایی که توسط

gii

ساخته میشوند را الگو قرار بدهید

با این حال اگر فکر میکنید اشتباه میکنم خوشحال میشم راهنماییم کنید

و در مورد مدل فعلی ، اگر منظورتون از کارهای کاربران امثال

Profile

و

Activity

است من پیشنهاد میکنم که مدل های جدا بسازید تا اینکه بخواهید به این مدل صفتهای جدید اضافه کنید. ولی برای کنترل دسترسی و ثبت نام و ورود و خروج این مدل خیلی قدرتمنده مگر اینکه نیازهای خیلی متفاوتی در پروژه داشته باشید

[/right][/size]

[rtl]سلام

خوب نوشتید ولی استاندارد رو رعایت نکردید.

مهمترینش هم اونکه برای مدل user باید اینترفیس yii\web\IdentityInterface رو ایمپلمنت کنید

خود کدی که جی تولید می کند بسیار مناسب و قابل تغییر به هر نحو هست.[/rtl]

[right]

سلام

ممنون که جواب دادید ممکنه یه نمونه خیلی ساده و ابتدایی هم بزنید

[/right]