เรียนรู้การทำงานและการใช้งาน 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 ก็สามารถแบ่งลำดับของการทำงานในแต่ละเหตุการณ์ได้
ความคิดเห็น