Datgs' Blog

Quyết chiến quyết thắng !

Archive for the tag “model”

Một điểm rất hay của Yii Model


Hôm nay xem overview của Yii Framework, khám phá ra cách tổ chức validation rules của Yii rất là hay. Tôi hay sử dụng CakePHP và không thỏa mãn với cách thiết lập validation rules của nó:

CakePHP

Model::$validate = array(); # là một biến trong một class. Vì thế rất là bất tiện khi muốn có một validation rule tùy biến tham số được (ví dụ password pattern lấy ra từ configuration, hoặc database). Thông thường sẽ phải viết một hàm callback cho cái rule mới này.

Yii

public function rules() {

return array(

array(‘title, content, status’, ‘required’),
array(‘title’, ‘length’, ‘max’=>128),
array(‘status’, ‘in’, ‘range’=>array(1,2,3)), # range này có thể tùy biến được
array(‘tags’, ‘match’, ‘pattern’=>’/^[\w\s,]+$/’,
‘message’=>’Tags can only contain word characters.’),
array(‘tags’, ‘normalizeTags’),
array(‘title, status’, ‘safe’, ‘on’=>’search’),

);

}

Model::rules(); # trả về một mảng các validation rules. Vì vậy rất tiện lợi nếu như chúng ta cần tùy biến tham số từ database.

Một điểm có thể học tập được từ Yii validation rules là cách tổ chức theo nhóm. Bạn thử tưởng tượng bạn đang sử dụng CakePHP để làm điều này? Một table có khoảng 20 fields mà thực hiện validation theo chuẩn CakePHP thì quá oải.

 

Loading models cần thiết cho từng action (cakePHP)



http://www.milesj.me/blog/read/16/loading-models-specific-to-certain-actions

Trong cakePHP, một controller có thể điều khiển rất nhiều models, đồng nghĩa với việc thời gian nạp các models đó rất lớn (cakePHP performance tốn nhiều thời gian để nạp các models).

Tuy nhiên các models của một controller lại thường không sử dụng hết trong một actions => Thừa.

Vì vậy, có một giải pháp để “chỉ nạp các models cần thiết trong một action” như sau:

/** * Executed before each action */

function beforeFilter() {

parent::beforeFilter();

// Load action specific models

switch ($this->params['action']) {

case ‘friends’:

$models = array(‘Friend’);

break;

case ‘messages’:

$models = array(‘Message’);

break;

case ‘blog’:

$models = array(‘Entry’, ‘Comment’);

break;

}

if (!empty($models)) {

foreach ($models as $model) {

$this->loadModel($model);

}

}

}

Việc này sẽ tăng performance của cakePHP lên khi controller của bạn sử dụng nhiều models. Cách tổ chức model như CakePHP với nhiều ràng buộc và kiểm tra dữ liệu khiến cho việc xử lý chương trình trở nên nặng nề hơn.

Post Navigation

Follow

Get every new post delivered to your Inbox.

Join 386 other followers