Yii Framework

Yii Framework

Behavior trong Yii: giới thiệu, cách tạo và sử dụng

Trong Yii sử dụng Active Record, một cách thật tuyệt vời để thao tác với database, tách biệt các business logic và dữ liệu giúp bạn dễ dàng hơn trong việc bảo trì code. Nếu bạn muốn thêm một số method nào đó cho tất cả các model, bạn chỉ cần tạo ra 1 class đặt trong components được extend từ CActiveRecord, và những model của bạn sẽ extend từ class này. Vậy là bạn đã nó được tất cả các method muốn thêm.

 

Nhưng bạn sẽ làm gì khi chỉ muốn thêm một vài method đặc biệt cho một số Model đặc biệt (*) mà không phải phải tất cả. Tạo ra một thêm một class nữa rồi extend từ class này. Rồi một ngày nào đó bạn muốn bổ sung thêm một vài method nữa, nhưng chỉ ở 1 số class trong cái đống class đặc biệt trước đó (*). Hơi lu bu rồi đó :D. Các framework khác giải quyết vấn đề này như thế nào tôi không rõ, vì mới xem qua 1 vài framework và chỉ đi sâu vào Yii thôi. Trong Yii giải quết tình huống này bằng Behavior.

 

Behavior là một object có các method sẽ được thừa kế bằng cách đính kèm vào model thông qua việc tập hợp các chức năng bổ sung cho class này.

 

Class behavior được implement từ IBehavior interface. Hầu hết các behavior có thể extend từ CBehavior base class. Nếu behavior được dùng để gắn vào model, nó có thể extend từ CModelBehavior hoặc CActiveRecordBehavior để thực hiện các tính năng bổ sung cho model.

 

Tóm lại:
- Behavior giải quyết vấn đề cho những người muốn thực hiện những chức năng khác với người dùng bình thường và những chức năng này được chia sẽ cho một vài model đặc biệt nhưng không phải là tất cả các model.
- Nếu bạn cần các chức năng đặc biệt muốn chia sẽ với tất cả các model, tốt hơn bạn tạo ra một class được extends từ CActiveRecord và sau đó  extend các model của bạn từ nó.

 

Tạo và sử dụng Behavior

Behavior của trong ví dụ đơn giản sẽ chuyển trường title model thành một chuỗi alias (slug).
Lưu ý: đây chỉ là demo tham khảo để hiểu về Behavior của Yii, SlugBehavior này không thực tế khi áp dụng cho application của bạn.

 

Nó cần được extend từ CActiveRecordBehavior. Code cụ thể như bên dưới

class SlugBehavior extends CActiveRecordBehavior {

    public $source = 'name';

    public function toAlias() {
        $str = $this->Owner->{$this->source};

        $str = trim(mb_strtolower($str, 'UTF-8'));
        $strFind = array(
            '- ', ' ', 'đ',
            'á', 'à', 'ạ', 'ả', 'ã', 'ă', 'ắ', 'ằ', 'ặ', 'ẳ', 'ẵ', 'â', 'ấ', 'ầ', 'ậ', 'ẩ', 'ẫ',
            'ó', 'ò', 'ọ', 'ỏ', 'õ', 'ô', 'ố', 'ồ', 'ộ', 'ổ', 'ỗ', 'ơ', 'ớ', 'ờ', 'ợ', 'ở', 'ỡ',
            'é', 'è', 'ẹ', 'ẻ', 'ẽ', 'ê', 'ế', 'ề', 'ệ', 'ể', 'ễ',
            'ú', 'ù', 'ụ', 'ủ', 'ũ', 'ư', 'ứ', 'ừ', 'ự', 'ử', 'ữ',
            'í', 'ì', 'ị', 'ỉ', 'ĩ',
            'ý', 'ỳ', 'ỵ', 'ỷ', 'ỹ');
        $strReplace = array(
            '', '-', 'd',
            'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
            'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o',
            'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e',
            'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u',
            'i', 'i', 'i', 'i', 'i',
            'y', 'y', 'y', 'y', 'y');
        return preg_replace('/[^a-z0-9\-]+/i', '', str_replace($strFind, $strReplace, $str));
    }
}

 

Gắn behavior này vào model

public function behaviors() {
    return array(
        'SlugBehavior' => array(
            'class' => 'application.behaviors.SlugBehavior'
        ),
    );
}

 

Đoạn code trên cho bạn thấy làm cách nào để gắn một behavior vào model.
Trong trường hợp này tôi đặt nó trong protected/behaviors và bên trong folder này là file SlugBehavior.php với tên class là tên tập tin.

Sau khi gắn behavior vào mode class, chúng ta có thể sử dụng nó đơn giản như gọi một method của model class.
Với behavior trên chúng ta chỉ cần: $model->toAlias() nó sẽ trả về 1 chuỗi alias được sinh tự động từ name

 

Bài viết chỉ giới hạn trong phạm vi Behavior cho Model; hy vọng giúp bạn hiểu rõ hơn phần nào về Yii Behavior.

Khả năng có hạn, chỉ hiểu được thế này. Bạn thấy có sai sót gì, hãy comment bên dưới để mọi người hiểu rõ hơn.

Tham khảo thêm tại http://www.yiiframework.com/wiki/44/behaviors-events

Bài đăng khác

HỖ TRỢ TRỰC TUYẾN

Mr. Lĩnh

0939.898.458

linhnp@panda.com.vn

Mr. Lai

0939.38.77.39

lainp@panda.com.vn

Processing...