เหตุผลที่ควรใช้ Yii Framework 2 ในการพัฒนา Web Application ด้วย ภาษา PHP

wave

เหตุผลที่ควรใช้ Yii Framework 2 ในการพัฒนา Web Application ด้วย ภาษา PHP

มานพ กองอุ่น 26 พ.ค. 2015 10:46:32 11,500

สวัสดีครับ อย่างที่เคยเขียนบทความว่า "เหตุผลที่ควรใช้ Framework ในการพัฒนา Web Application ด้วยภาษา PHP" ก็ได้ทราบกันแล้วว่าการเขียนแบบเดิมนั้นคงหมดยุคหมดสมัยกันไปแล้ว ปัจจุบันก็มี PHP Framework เกิดขึ้นมากมาย แต่ละค่ายก็งัดเอาสิ่งที่ตัวเองเด่นมาประชันกับค่ายอื่นๆ แล้วตัวไหนดีล่ะ ผมจะไม่ตัดสินว่าตัวไหนดีนะครับ แต่จากประสบการณ์ในการพัฒนาด้วย Yii2 นั้นผมก็จะอธิบายแค่ในส่วน Yii2 เท่านั้นนะครับ ^ ^

สำหรับบทความนี้ผมจะกล่าวถึงมุมของการพัฒนา Web Application ด้วย Yii Framework 2 หรือ Yii2 ซึ่งเป็น Version ที่ได้ออก Version Stable เมื่อเดือนตุลาคม 2557 ที่ผ่านมา ณ ปัจจุบันมีการพัฒนาอย่างต่อเนื่องซึ่ง Version ที่ Stable ปัจจุบันคือ 2.0.4 ไปดูกันเลยครับว่าดีอย่างไร

การทำระบบ Route แบบ Auto

แน่นอนครับ PHP Framework ทุกตัวถูกออกแบบมาในมาตรฐานสถาบัตยกรรม MVC ฉะนั้นในเรื่อง MVC ของแต่ละค่ายก็อาจมีความแตกต่างกันแต่บนพื้นฐาน Concept เดียวกัน ดังนั้นเรื่องของ Route นี้สำคัญมากคือการ request route ผ่าน url สำหรับ Yii2 มีการสร้าง Route แบบอัตโนมัติ เช่นหากสร้าง Module ชื่อ manop และ Controller ชื่อ kongoon และ Action ชื่อ hello และมีตัวแปรส่งมาให้คือ id=1, fname=Manop และ lname=Kongoon ก็จะมีการเรียก Url ดังนี้

index.php?r=manop/kongoon/hello/&id=1&fname=Manop&lname=Kongoon

ซึ่งใน Controller จะเขียนโปรแกรมดังนี้

class Kongoon extends Controller{
    public function actionHello($id=null,$fname=null,$lname=null){
        echo $id,$fname,$lname;// แสดงค่าตัวแปรโดยการรับค่าแบบ GET ให้อย่างอัตโนมัติ
        //return $this->render('hello');
    }
}

หากมีการตรวจสอบ Post ก็สามารถเขียนโปรแกรมตรวจสอบได้ง่าย ตัวอย่างเช่น

////
public function actionCreate(){
    if ($model->load(Yii::$app->request->post())) {//ตรวจสอบการ POST ค่ามาจาก ฟอร์ม
        $model->save();
    }
}
////

และหากมีการ Rewrite ก็สามารถกำหนดเพิ่มเติมได้ด้วย

มีระบบ ActiveRecord

ใน Yii2 ทุกอย่างที่เป็นฟอร์มนั้นควรจะสร้างเป็น Model เพื่อกระทำการกับข้อมูลนั้น เช่น ฟอร์มเข้าสู่ระบบ (LoginForm) ฟอร์มสมัครสมาชิก (SignupForm) เป็นต้น โดยในการสร้างฟอร์มที่ View นั้นจะใช้การสร้างแบบ ActiveRecord โดยมีระบบในการ Validate จาก method rules() ใน Model ซึ่งทำให้สะดวกและง่ายดายมาก (เขียนโค้ดสั้นมาก) ดูตัวอย่าง

models/TestForm.php

<?php
namespace app\models;

class TestForm extends Model{
    public $fname;
    public $lname;

    public function rules(){
        return [
            [['fname','lname'],'required'], //ค่าไม่ว่าง

        ];
    }

    public function attributeLabels(){ //Label จะแสดงในฟอร์ม และทุกๆ ที่ที่มีการอ้างถึง fname และ lname
        return [
            'fname'=>'ชื่อ',
            'lname'=>'นามสกุล',
        ];
    }
}

?>

จะเห็นว่าการกำหนดค่าหรือเงื่อนไขต่างๆ  จะเก็บไว้ใน method rules() และ Label ที่จะใช้กับทั้งหมดของ Web Application มีมีการอ้างถึง Property fname และ lname นั้นก็จะสามารถกำหนดได้จาก method attributeLabels() นั่นเองครับ

controllers/TestController.php

<?php
namespace app\controllers;
use app\models\TestForm;

class TestController extends Controller{

    public function actionTest(){
        $model = new TestForm;

        if ($model->load(Yii::$app->request->post())) {
            echo $model->fname.' '.$model->lname;//แสดงออกมาทางหน้าจอ
        }else{
            return $this->render('test',['model'=>$model]);//ถ้าไม่มีการกดปุ่มมาให้แสดงฟอร์มจาก views/test/test.php
        }
    }

}

ในส่วนของ Controller นั้นเป็นตัวกลางระหว่าง Model และ View โดยจะสร้าง Model TestForm แล้วส่งให้ View ผ่านตัวแปร model โดยให้ฟอร์มนำไปแสดงผลตามต้องการ และจะมี method ในการตรวจสอบว่ามีการส่งค่ามาหรือยัง คือ Yii::$app->request->post() โดยตรวจสอบผ่าน method ของ Model คือ $model->load() นั่นเอง ถ้ามีการส่งค่าจากฟอร์มมาก็ให้ทำบางอย่างกับข้อมูลเช่น Echo ข้อมูลออกมาทางหน้าจอ เป็นต้น ที่สำคัญโค้ดตรงนี้สั้นมากๆ และทำความเข้าใจง่ายด้วยครับ

views/test/test.php

<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'firstname')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'lastname')->textInput(['maxlength' => true]) ?>

<div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'เพิ่ม' : 'แก้ไข', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

<?= ActiveForm::end();?>

สังเกตุว่าไม่มีคำสั่ง Html เลยทีเดียว โดย ActiveForm นั้นจะ Generate ฟอร์มและ Object ของฟอร์มให้อัติโนมัติ อันนี้มันเจ๋งมาก ลดเวลาเรื่องของการเขียน Html ลงได้เยอะเลย และที่สำคัญนะครับ การเพิ่มและการแก้ไขข้อมูลใช้ฟอร์มเดียวกัน โดยหากมีการแก้ไขก็จะแสดงข้อมูลเดิมให้อัตโนมัติ

มี Widget ในการทำตัวแสดงผล

สำหรับ Widget ใน Yii2 นั้นโดยหลักจะมีอยู่ 3 ส่วนด้วยกันคือ GridView, ListView และ DetailView ซึ่งจริงๆ แล้ว Widget มีมากมายหลายตัวนะครับ แต่ในที่นี้จะกล่าวถึงเพียง 3 ตัวนี้เท่านั้น

การส่งข้อมูลมาแสดงนั้นเราจะส่งข้อมูลออกมาในรูปแบบของ ActiveDataProvider โดยมีลักษณะของการส่งข้อมูลออกมาดังนี้

use yii\data\ActiveDataProvider;
public function actionIndex(){
$dataProvider = new ActiveDataProvider([
    'query'=>Post::find(),//ดึงข้อมูลทั้งหมดจาก Model Post

]);
return $this->render('index',['dataProvider'=>$dataProvider]);
}

 

GridView 

เป็นการแสดงข้อมูลออกมาในรูปแบบตารางนั่นเอง โดยรับ ActiveDataProvider มาแสดงผล เช่น

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        'id',
        'name',
        'created_at:datetime',
        // ...
    ],
]) ?>

List View

สำหรับการแสดงผลแบบ List View นั้นจะต้องมีไฟล์อีกไฟล์หนึ่งเป็น Template ในการแสดงผล เช่นไฟล์ชื่อ _post.php เป็นต้นโดยมีการกำหนดดังนี้

<?php
use yii\widgets\ListView;
echo ListView::widget([
    'dataProvider' => $dataProvider,
    'itemView' => '_post',
]);
?>

ไฟล์ _post.php

<?php
use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
?>
<div class="post">
    <h2><?= Html::encode($model->title) ?></h2>
    
    <?= HtmlPurifier::process($model->text) ?>    
</div>

Detail View

Detail View เป็นการแสดงรายละเอียดของรายการที่เราเลือกดูเช่นสินค้า 1 ชิ้น หรือ username: admin เป็นต้นโดยเป็นการแสดงรายเอียดต่างๆ ของข้อมูล 1 Record นั่นเอง

<?php
echo DetailView::widget([
    'model' => $model,
    'attributes' => [
        'title',               // title attribute (in plain text)
        'description:html',    // description attribute formatted as HTML
        [                      // the owner name of the model
            'label' => 'Owner',
            'value' => $model->owner->name,
        ],
        'created_at:datetime', // creation date formatted as datetime
    ],
]);
?>

ครับ ในส่วนของ Widgets สามารถดูเพิ่มเติมได้ที่นี่

มี Helper ให้เลือกใช้มากมาย

Helper คือตัวช่วยในการ Generate Html Code ให้เราโดยอัตโนมัติโดยที่เราไม่ต้องมานั่งเขียน Html ให้ยากตัวอย่างเช่น Html Helper

<?php echo Html::a('Link',['/controller/action','fname'=>'Manop,'lname'=>'Kongoon']);?>

จะแปลงเป็น Html Code

<a href="/controller/action?fname=Manop&lname=Kongoon">Link</a>

การแสดงรูปภาพ

<?php echo Html::img('http://www.programmerthailand.com/images/logo.png');?>

จะแปลงเป็น Html Code

<img src="http://www.programmerthailand.com/images/logo.png">

ซึ่งสามารถดูเรื่อง Helper เพิ่มเติมได้ที่ http://www.yiiframework.com/doc-2.0/guide-helper-overview.html

Gii Generator

ระบบ Gii Generator เป็นระบบที่ใช้ในการ Generate Code เช่น Model, Controller, CRUD, Modules, Form และอื่นๆ ได้อย่างหลากหลาย โดย Gii จะช่วยให้เราสามารถสร้าง Model จากทุกๆ ตารางได้เพียงแค่ใส่เครื่องหมาย * ตอนสร้าง Model เราจะได้ Model ของ 100 ตารางในเวลาไม่ถึง 10 วินาที และสามารถกำหนด Attribute Labels ที่เป็นภาษาไทยได้ด้วยการใส่ Comment ใน Fields ของทุกๆ ตาราง และสามารถทำ CRUD (Create, Read, Update และ Delete) ได้ภายในเวลาไม่ถึง 10 วินาทีเช่นกัน

Gii Generator ช่วยให้เราลดเวลาในส่วนของการเขียนโปรแกรม Model, CRUD พื้นฐาน, Controller ต่างๆ หรือแม้กระทั่งการสร้าง Module ช่วยให้ การพัฒนา Web Application ได้ไวมากๆๆๆ เลยทีเดียว

มี Bootstrap ในตัว

ตอนนี้ Bootstrap ก็ได้กลายเป็นส่วนหนึ่งของการพัฒนา Web Application และมาตรฐานของการทำ Responsive Web ไปเป็นที่เรียบร้อยแล้วและ Yii2 ก็นำเอา Bootstrap เข้ามาเป็นส่วนหนึ่งให้โดยอัตโนมัติ ทำให้การ Design Web Application นั้นสามารถเรียกใช้งาน Class (Html Class นะครับ) ต่างๆ จากเจ้า Bootstrap ได้เลยทันที โดยที่เราไม่ต้องมานั่งเขียนใหม่ หรือไม่ต้องมานั่งเอา Bootstrap มาติดตั้งใหม่ตอนสร้าง Project เพราะ Yii2 จัดมาให้แล้วครับ

ใช้มาตรฐาน PSR

แน่นอนครับหลายๆ Framework ตอนนี้ก็ใช้มาตรฐาน PSR นี้กันอยู่ซึ่งมาตรฐานนี้เกิดขึ้นโดยกลุ่มผู้พัฒนาระบบด้วยภาษา PHP มานั่งสร้างร่วมกันให้เป็นมาตรฐานและแนวทางการเขียนร่วมกัน (คร่าวๆ นะครับ สามารถใช้อาจารย์ Goo ค้นเพิ่มเติมได้ครับ) เมื่อเกิดมาตรฐานนี้แล้วการติดตั้งก็แสนง่ายดายครับโดยผ่านโปรแกรมจัดการ Library ที่เรียกว่า Composer โดยหากมี Library ไหนที่เราใช้งานอยู่มีการ Update เจ้า Composer จะไปตรวจสอบที่เว็บไซต์ Packagist.org แล้วจัดการ Update Library นั้นในเครื่องเราให้ทันที โอ้ว แบบว่าไม่ต้องไปนั่งเข้าเว็บผู้พัฒนา Library แล้วดาวน์โหลดมา Update เองอีกต่อไป มันยอดเยี่ยมมากใช่ไหมครับ

ท้ายเรื่อง

ครับนี่ก็เป็นเพียงบางส่วนเท่านั้น สำหรับนักพัฒนารุ่นใหม่ๆ หรือผู้ที่กำลังมองหา Framework คู่ใจอยู่ลองพิจารณา Yii2 นะครับ สามารถดูข้อมูลเพิ่มเติมได้ที่เว็บไซต์ Offical ของ Yii Framework ได้ที่ http://www.yiiframework.com/ และดู Documentation ได้ที่ http://www.yiiframework.com/doc-2.0/index.html และดู Guide ได้ที่ http://www.yiiframework.com/doc-2.0/guide-index.html

นอกจากนั้นใน Programmer Thailand ก็มีหลักสูตรสำหรับศึกษา Yii Framework 2 ได้แบบฟรีในหลักสูตร พื้นฐานการพัฒนา Web Application ด้วย Yii2 นอกจากนั้นเรายังมีช่องทางในการสอนสดออนไลน์ฟรีโดยสามารถติดตามกำหนดการได้ที่ Programmer Thailand Facebook fanpage

ก่อนจากอย่าลืม กรอกอีเมลล์เพื่อสมัครรับข้อมูลข่าวสารใหม่ได้จากช่องด้านล่างนะครับ ผมและทีมงานต้องลาไปก่อน สวัสดีครับ

ความคิดเห็น