Rules là 1 phần quan trọng của models, là nơi mà bạn thực hiện các phép logic,kết nối đến database .Hôm nay mình sẽ hướng dẫn các bạn cách chỉnh sửa và thêm các quyền mà bạn nghĩ ra cần thực hiện .Ở phần này chúng ta sẽ đi tìm hiểu các vấn đề :

  1. Rules là gì ,Nằm ở đâu ,tác dụng của rules
  2. Kiến thức cần có
  3. Cách custom rules trong thực tế

Rules là gì ,Nằm ở đâu ,tác dụng của rules

Rules là bộ các quy tắc mà dữ liệu nhập vào phải đáp ứng nó thì mới được thực hiện .

Vị trí thường nằm của rules là nằm sau các function behaviors() và tableName() .

Các quy tắc thường có trong rules() đó là định dạng kiểu dữ liệu như string,interger ,required,

Kiến thức cần có

  1. Controller với bài viết :http://hbsprogram.com/controllers-trong-yii2/
  2. Models với bài viết :http://hbsprogram.com/models-trong-yii2/

Cách custom rules trong thực tế

Hôm nay mình sẽ hướng dẫn các bạn cách custom trong thực tế với demo là bảng dữ liệu status với mục đích ko đăng 2 status giống nhau .

Link demo : http://demo.hbsprogram.com/status

Sql cơ sở dữ liệu :

CREATE TABLE `status` (
  `id` int(11) NOT NULL,
  `status` varchar(11) NOT NULL,
  `date_create` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `status`
--
ALTER TABLE `status`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `status`
--
ALTER TABLE `status`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Bạn tạo cơ sở dữ liệu như trên tiếp theo đến phần models .Phần này là mục đích chính của bài viết này .

<?php

namespace common\models;

use Yii;
use phpDocumentor\Reflection\Types\This;
use yii\behaviors\TimestampBehavior;

/**
 * This is the model class for table "status".
 *
 * @property integer $id
 * @property string $status
 * @property integer $date_create
 */
class Status extends \yii\db\ActiveRecord
{
/**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'status';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['status' ], 'required'],
            [['date_create'], 'integer'],
            [['status'], 'string', 'max' => 11],
        	['status','validateStatus'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'status' => Yii::t('app', 'Status'),
            'date_create' => Yii::t('app', 'Date Create'),
        ];
    }
    
    public function validateStatus($attribute, $params)
    {
    	if(!$this->errors)
    	{
    		$status = Status::findOne(['status'=> $this->status]);
    		if($status)
    		{
    			$this->addError('status','Status exit');
    		}
    	}
    }
}

Các bạn chú ý 2 điểm đặc biệt ở đây . 1 là ở phần rules 2 là đoạn public function validateStatus().

Đoạn rules() bạn cần thêm :

['status','validateStatus'],

Mục đích là xác định status phải thỏa mãn các yêu cầu cuả function validateStatus() .

Và ở phần function validateStatus() bạn custom các yêu cầu của mình .Ở ví dụ này mình yêu cầu là ko có 2 status giống nhau :

if(!$this->errors)
    	{
    		$status = Status::findOne(['status'=> $this->status]);
    		if($status)
    		{
    			$this->addError('status','Status exit');
    		}
    	}

Mình truy vấn dữ liệu với điều kiện là status giống với dữ liệu nhập vào .Nếu trùng thì hiện ra thông báo đã tồn tại

Còn phần views và controller không có gì đặc biệt cả .Bạn có thể nom và thử demo ở link sau :http://demo.hbsprogram.com/status .

Controller mình coder như sau :

<?php

namespace frontend\controllers;

use Yii;
use common\models\Status;
use common\models\StatusSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

/**
 * StatusController implements the CRUD actions for Status model.
 */
class StatusController extends Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all Status models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new StatusSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single Status model.
     * @param integer $id
     * @return mixed
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Status model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Status();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Updates an existing Status model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Deletes an existing Status model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

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

    /**
     * Finds the Status model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Status the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Status::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}

Còn phần view các bạn tự viết hoặc liên hệ mình nhé .

Phần này mình cảm thấy rất hay vì nó sẽ làm bạn biết cách tạo 1 rules() phục vụ việc coder của mình.Custom lại những quy định mà database cơ bản không thể diễn tả được ý nghĩa của rules đó .

Các bạn có gì thắc mắc hãy để lại comment để chúng ta cùng nhau tìm hiểu .Nếu thấy bài viết hay và có ý nghĩa hãy chia sẻ nó đến với bạn bè bạn nhé .Thân