วันพุธที่ 22 มกราคม พ.ศ. 2557

สอนการใช้งาน Controller และ View ใน Yii Framework



       ห่างหายจากการเขียนบทความไปนานพอสมควรครับ กลับมาคราวนี้ขอสานต่อโปรเจ็คบทความ Yii Framework ต่อครับ เนื่องจากผมได้เขียนไปบ้างแล้วทั้งหมด 3 บทความ คือ 1.ขั้นตอนการติดตั้ง Yii Framework , 2.Yii Framework กับการเชื่อมต่อกับฐานข้อมูล MySQL และการใช้งาน Gii Generator , 3.Yii Framework กับการทำ Friendly URL
สำหรับเหตุผลที่ผมอยากเขียนบทความเกี่ยวกับเรื่องนี้มากที่สุด เพราะผมอยากเปลี่ยนสไตล์การเขียนโค๊ดให้เป็นแบบ OOP หรือเขียนแบบเชิงวัตถุทั้งหมดครับ และอยากรณรงค์ให้ทุกคนทำแบบนี้ครับ เพราะมันมีประโยชน์ต่อการพัฒนาเว็บไซต์ให้มีความยืดหยุ่นสูง ทำงานรวดเร็ว มีความปลอดภัยสูง และทำงานร่วมกันเป็นทีมได้ง่าย เพราะใช้หลักการทำงานของ Framework ที่เรียกว่า MVC ครับ
       บทความนี้จะสอนให้รู้จัก Controller กันก่อนครับ ซึ่งคือองค์ประกอบหนึ่งของ MVC ซึ่งก็คือ C นั้นเองซึ่งคือชื่อย่อของ Controller นั้นเองครับ Controller ทำหน้าที่เป็นตัวเชื่อมระหว่าง Model (M) กับ View (V) ครับ โดยมันจะทำหน้าประสานงานระหว่าง View กับ Model เพื่อให้สามารถส่งข้อมูลหากันหรือทำงานร่วมกันได้
       Controller จะรับค่าที่ส่งจาก View แล้วส่งไปให้ Model เพื่อจัดการกับข้อมูลต่ออีกที เราจะเห็นการทำงานแบบนี้ตอนสร้างฟอร์มเพื่อ เพิ่ม/แก้ไข/ลบข้อมูล นั้นเองครับ  ในทางกลับกัน มันยังสามารถรับค่าจาก Model ซึ่งเป็นดึงค่าจากฐานข้อมูลแล้วส่งให้กับ View เพื่อแสดงผลข้อมูลได้อีกด้วย ซึ่งก็คือการคิวรี่ข้อมูลจากฐานข้อมูลมาแสดงนั้นเองครับ และนอกจากนี้มันยังสามารถทำงานโดยที่ไม่ต้องทำงานร่วมกับModelก็ได้ ในกรณีที่ไม่ต้องมีการเชื่อมต่อกับ Database ก็ไม่ต้องทำงานร่วมกับ Model แค่รับค่ามาจาก View เพื่อประมวลผลแล้วส่งกลับไปแสดงที่ View เหมือนเดิม รวมถึงมันสามารถทำงานเดี่ยวๆ โดยที่ไม่ต้องทำงานร่วมกับ View และ Model ก็ได้ โดยที่ไม่ต้องเรียกใช้อ๊อบเจ็คจาก Model หรือ ไม่ใช้เมธอด render  เพื่อแสดงผลใน View

ต่อไปเราจะสร้างไฟล์ Controller กันครับ โดยผมจะตั้งชื่อ Controller ตัวนี้ของผมชื่อว่า Category ครับ
ให้เข้าไปที่ Yii code generator กันเลยครับ โดยพิมพ์ URL ต่อท้าย index.php ดังนี้ index.php?r=gii (ศึกษา gii เพิ่มได้จาก Yii Framework กับการเชื่อมต่อกับฐานข้อมูล MySQL และการใช้งาน Gii Generator)

เมื่อพิมพ์รหัสผ่านเข้าไปแล้ว ให้คลิกที่เมนู Controller Generator ดังรูป

เราจะสร้าง controller ชื่อว่า category ให้เราพิมพ์ดังนี้


1.ชื่อ controller ที่เราต้องการจะใช้
2.ชื่อ Class ที่เราจะ Extends มาใช้ ซึ่งก็คือ Controller Class นั้นเองครับ
3.ชื่อ Action Method แรกที่เราจะให้ทำงาน ถ้าเราตั้งชื่อว่า index มันจะสร้าง Method ชื่อว่า actionIndex() ใน Controller ชื่อว่า Category และสร้างไฟล์ในส่วนของ views ให้เราด้วย เช่น views/category/index.php

ให้คลิกที่ปุ่ม Preview จะได้ผลลัพธ์ดังรูป

1.แสดง path ของไฟล์ controller ที่ Gii จะสร้างให้ ซึ่งมันจะสร้างไฟล์ชื่อ CategoryController.php ให้ในโฟลเดอร์ controllers
2.แสดง path ของไฟล์ที่ใช้ในส่วนของการแสดงผลหรือ views ซึ่งก็คือ ไฟล์ index.php ซึ่งจะอยู่ในโฟลเดอร์ category เพื่อบอกว่ามันคือส่วนแสดงผลของ Category Controller นะ

จากนั้นให้กดปุ่ม Generate เพื่อสร้างส่วนของ Controllers และ Views จะได้ผลลัพธ์ดังรูป



เปิดไฟล์ CategoryController.php ขึ้นมามันจะ Generate โค๊ดให้เราบางส่วนครับ ซึ่งก็คือ Method actionIndex() ที่เราได้กำหนดให้สร้างในขั้นการ Generate Controller นั้นเองครับ


จากนั้นให้ RUN ดูผลลัพธุ์ โดยพิมพ์ URL ใน Browser ว่า http://localhost/yiiproject/index.php?r=category จะได้ผลลัพธ์ที่ Gii Generator สร้างให้เรา ดังนี้


ผลลัพธุ์นี้เกิดจากคำสั่ง $this->render(‘index’); ของเมธอด actionIndex() นั้นเองครับ

เราจะแก้ไขโค๊ดซักหน่อยครับ โดยจะพิมพ์ข้อความ Hello ออกมาแสดง โดยไปที่ CategoryController.php ตรง actionIndex() ให้แก้ไขโค๊ดดังนี้

public function actionIndex()
{
   $showHello='Hello';
   $yourName='Panuwat';
   $this->render('index',array('showHello'=>$showHello,'showName'=>$yourName));
   //ไปแสดงผลที่ views/category/index.php
}

และไปที่ views/category/index.php ให้แก้ไขโค๊ดในไฟล์ index.php ให้เป็นดังนี้

<?php
$this->breadcrumbs=array(
   'Category',
);
?>
<p>
<?php
echo $showHello,$showName;
?>
</p>

จากนั้นให้ RUN ดูผลการทำงาน โดยพิมพ์ http://localhost/yiiproject/index.php?r=category จะได้ผลลัพธ์ดังนี้


การทำงานในส่วนนี้ จะเป็นทำงานระหว่าง Views กับ Controllers เท่านั้นครับ สำหรับในส่วนของ Model ผมจะขอกล่าวในบทความต่อไปครับ ซึ่งจะเป็นส่วนที่ทำงานกับ Database และส่วนของการ Validate ข้อมูลจากForm

3 ความคิดเห็น :

  1. อยากให้อธิบายเพิ่มเติมส่วนไหนบ้าง บอกได้จากส่วนแสดงความคิดเห็นได้เลยครับ

    ตอบลบ
  2. ขอสอบถามหน่อยนะครับ เราจะเข้าไปสร้าง Model Class ใน Crud Generator แต่ระบบมันฟ้องว่า Table '' does not have a primary key. หมายความว่ายังไงครับ ? ขอรบกวนด้วยนะครับ

    ตอบลบ
    คำตอบ
    1. หมายถึงยังไม่กำหนด Primary Key ให้กับ Table หรือป่าวครับ ดังนั้นต้องกำหนดฟิลด์ 1 ตัวให้เป็นไพรมารี่คีย์ครับ

      ลบ