Yii - Tạo sự kiện

Trong chương này, chúng ta sẽ xem cách tạo một sự kiện trong Yii. Để hiển thị các sự kiện đang hoạt động, chúng tôi cần dữ liệu.

Chuẩn bị DB

Step 1- Tạo cơ sở dữ liệu mới. Cơ sở dữ liệu có thể được chuẩn bị theo hai cách sau.

  • Trong terminal chạy mysql -u root –p

  • Tạo cơ sở dữ liệu mới thông qua CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Step 2 - Định cấu hình kết nối cơ sở dữ liệu trong config/db.phptập tin. Cấu hình sau đây dành cho hệ thống được sử dụng hiện tại.

<?php
   return [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host=localhost;dbname=helloworld',
      'username' => 'vladimir',
      'password' => '12345',
      'charset' => 'utf8',
   ];
?>

Step 3 - Bên trong thư mục gốc run ./yii migrate/create test_table. Lệnh này sẽ tạo sự di chuyển cơ sở dữ liệu để quản lý DB của chúng tôi. Tệp di chuyển sẽ xuất hiện trongmigrations thư mục gốc của dự án.

Step 4 - Sửa đổi tệp di chuyển (m160106_163154_test_table.php trong trường hợp này) theo cách này.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160106_163154_test_table extends Migration {
      public function safeUp() {
         $this->createTable("user", [ "id" => Schema::TYPE_PK, "name" => Schema::TYPE_STRING, "email" => Schema::TYPE_STRING, ]); $this->batchInsert("user", ["name", "email"], [
            ["User1", "user1@gmail.com"],
            ["User2", "user2@gmail.com"],
            ["User3", "user3@gmail.com"],
            ["User4", "user4@gmail.com"],
            ["User5", "user5@gmail.com"],
            ["User6", "user6@gmail.com"],
            ["User7", "user7@gmail.com"],
            ["User8", "user8@gmail.com"],
            ["User9", "user9@gmail.com"],
            ["User10", "user10@gmail.com"],
            ["User11", "user11@gmail.com"],
         ]);
      }
      public function safeDown() {
         $this->dropTable('user');
      }
   }
?>

Việc di chuyển trên tạo ra một userbảng với các trường sau: id, tên và email. Nó cũng thêm một vài người dùng demo.

Step 5 - Bên trong gốc dự án run ./yii migrate để áp dụng di chuyển vào cơ sở dữ liệu.

Step 6 - Bây giờ, chúng ta cần tạo một mô hình cho userbàn. Để đơn giản, chúng tôi sẽ sử dụngGiicông cụ tạo mã. Mở cái này raurl: http://localhost:8080/index.php?r=gii. Sau đó, nhấp vào nút “Bắt đầu” trong tiêu đề “Trình tạo mô hình”. Điền vào Tên bảng (“người dùng”) và Lớp mẫu (“Người dùng của tôi”), nhấp vào nút “Xem trước” và cuối cùng, nhấp vào nút “Tạo”.

Mô hình MyUser sẽ xuất hiện trong thư mục mô hình.

Tạo sự kiện

Giả sử chúng tôi muốn gửi email cho quản trị viên bất cứ khi nào người dùng mới đăng ký trên trang web của chúng tôi.

Step 1 - Sửa đổi models/MyUser.php nộp hồ sơ theo cách này.

<?php
   namespace app\models;
   use Yii;
   /**
   * This is the model class for table "user".
   *
   * @property integer $id
   * @property string $name * @property string $email
   */
   class MyUser extends \yii\db\ActiveRecord {
      const EVENT_NEW_USER = 'new-user';
      public function init() {
         // first parameter is the name of the event and second is the handler.
         $this->on(self::EVENT_NEW_USER, [$this, 'sendMailToAdmin']);
      }
      /**
      * @inheritdoc
      */
      public static function tableName() {
         return 'user';
      }
      /**
      * @inheritdoc
      */
      public function rules() {
         return [
            [['name', 'email'], 'string', 'max' => 255]
         ];
      }
      /**
      * @inheritdoc
      */
      public function attributeLabels() {
         return [
            'id' => 'ID',
            'name' => 'Name',
            'email' => 'Email',
         ];
      }
      public function sendMailToAdmin($event) {
         echo 'mail sent to admin using the event';
      }
   }
?>

Trong đoạn mã trên, chúng tôi xác định sự kiện "người dùng mới". Sau đó, trong phương thức init (), chúng tôi đính kèmsendMailToAdminchức năng cho sự kiện "người dùng mới". Bây giờ, chúng ta cần kích hoạt sự kiện này.

Step 2 - Tạo một phương thức được gọi là actionTestEvent trong SiteController.

public function actionTestEvent() {
   $model = new MyUser();
   $model->name = "John"; $model->email = "john@gmail.com";
   if($model->save()) { $model->trigger(MyUser::EVENT_NEW_USER);
   }
}

Trong đoạn mã trên, chúng tôi tạo một người dùng mới và kích hoạt sự kiện "người dùng mới".

Step 3 - Bây giờ gõ http://localhost:8080/index.php?r=site/test-event, bạn sẽ thấy như sau.