การใช้งาน Model Scenario ใน Yii Framework 2

คู่มือการเรียนรู้ Yii Framework 2 (Yii2)

บทเรียนดีๆ สำหรับผู้ที่ต้องการแบ่งปัน บทเรียนของคุณอาจมีค่าสำหรับอีกหลายๆ คน

beta version

การใช้งาน Model Scenario ใน Yii Framework 2

มานพ กองอุ่น yii scenario 2,428

เรียนรู้การทำงานและการใช้งาน Scenario ใน Model สำหรับ Yii Framework 2

ทำไมต้องใช้ Scenario ?

คงเป็นคำถามเพื่อสร้างความเข้าใจ ซึ่งเพื่อให้เข้าใจง่ายขึ้นจะขออธิบายว่า Scenario คือการเปิดเผย Attribute (Property) บางส่วนในบางสถานะหรือบางเหตุการณ์ ตัวอย่างเช่น ใน case ของการตรวจรักษาโรค

เรามี Model การตรวจ (Diag) ซึ่งมี Attribute ที่ต้องการเก็บคือ รหัสผู้ป่วย, น้ำหนัก, ความดันโลหิต, อาการเบื้องต้น, การวินิจฉัยจากแพทย์ เป็นต้น

เหตุการณ์ A ศูนย์ลงทะเบียนผู้ป่วย ต้องการกระทำกับ attribute แค่ รหัสผู้ป่วย
เหตุการณ์ B พยาบาลตรวจวัดเบื้องต้น ต้องการกระทำกับ attribute แค่ รหัสผู้ป่วย, น้ำหนัก, ความดันโลหิต, อาการเบื้องต้น
เหตุการณ์ C แพทย์วินิจฉัย ต้องการกระทำกับ attribute รหัสผู้ป่วย, น้ำหนัก, ความดันโลหิต, อาการเบื้องต้น, การวินิจฉัยจากแพทย์ เป็นต้น

ดังนั้นการแบ่งการเข้าถึง attribute ในสถานการณ์ต่างๆ นี้เราจะเรียกว่า ซีนาริโอ Scenario

ตัวอย่าง Model Diag

common/models/Diag.php

<?php
namespace common\models;

use yii\db\ActiveRecord;

class Diag extends ActiveRecord
{
    public function rules()
    {
        return [
            [['patient_id', 'weight', 'blood_pressure', 'pre_diag', 'diag'], 'required'],
            [['patient_id'], 'required', 'on' => 'register'],
            [['patient_id', 'weight', 'blood_pressure', 'pre_diag'], 'required', 'on' => 'prediag'],
            [['patient_id', 'weight', 'blood_pressure', 'pre_diag', 'diag'], 'required', 'on' => 'diag']
        ];
    }

    public function scenarios()
    {
        $sn = parent::scenarios();
        $sn['register'] = ['patient_id'];
        $sn['prediag'] = ['patient_id', 'weight', 'blood_pressure', 'pre_diag'];
        $sn['diag'] = ['patient_id', 'weight', 'blood_pressure', 'pre_diag', 'diag'];
        return $sn;
    }

    public function attributeLabels()
    {
        return [
            'patient_id' => 'ผู้ป่วย',
            'weight' => 'น้ำหนัก',
            'blood_pressure' => 'ความดันโลหิต',
            'pre_diag' => 'อาการเบื้องต้น',
            'diag' => 'แพทย์วินิจฉัย',
        ];
    }
}

 

ตัวอย่างการใช้งานใน Controller

<?php
namespace frontend\controllers;
use common\models\Diag;
use yii\web\Controller;

class DiagController extends Controller
{
    public function actionRegister()
    {
        $model = new Diag(['scenario' => 'register']); //แบบกำหนดค่าผ่าน config (constructor)
        //.... other code here
        return $this->render('register', ['model' => $model]); //ส่งไปให้ฟอร์ม
    }
    public function actionPrediag()
    {
        $model = new Diag(['scenario' => 'prediag']); //แบบกำหนดค่าผ่าน config (constructor)
        //.... other code here
        return $this->render('prediag', ['model' => $model]); //ส่งไปให้ฟอร์ม
    }
    public function actionDiag()
    {
        $model = new Diag();
        $model->scenario = 'diag'; // แบบกำหนดค่าให้กับ Property
        //.... other code here
        return $this->render('diag', ['model' => $model]); //ส่งไปให้ฟอร์ม
    }
}

สรุป

Scenario ใน Model ของ Yii Framework 2 ช่วยให้เราทำงานได้สะดวกมากยิ่งขึ้นในส่วนของการ Validate ข้อมูล โดยไม่จำเป็นต้องกรอกให้ครบทุก attribute เพียงกำหนด Scenario ก็สามารถแบ่งลำดับของการทำงานในแต่ละเหตุการณ์ได้


หากบทเรียนรู้มีความผิดพลาดประการใด หรือมีข้อเสนอแนะกรุณาแจ้ง contact@programmerthailand.com
มานพ กองอุ่น

มานพ กองอุ่น
admin

  • 2 เพื่อน
  • 13 ผู้ติดตาม
  • 763 โพสต์