Yii - คู่มือฉบับย่อ
Yii[ji:]framework เป็นเฟรมเวิร์ก PHP แบบโอเพนซอร์สสำหรับการพัฒนาเว็บแอปพลิเคชันสมัยใหม่อย่างรวดเร็ว มันถูกสร้างขึ้นจากรูปแบบคอมโพสิต Model-View-Controller
Yii มีคุณสมบัติที่ปลอดภัยและเป็นมืออาชีพเพื่อสร้างโครงการที่แข็งแกร่งอย่างรวดเร็ว เฟรมเวิร์ก Yii มีสถาปัตยกรรมแบบคอมโพเนนต์และการสนับสนุนการแคชที่มั่นคงเต็มรูปแบบ ดังนั้นจึงเหมาะสำหรับการสร้างเว็บแอปพลิเคชันทุกประเภท: ฟอรัมพอร์ทัลระบบจัดการเนื้อหาบริการ RESTful เว็บไซต์อีคอมเมิร์ซและอื่น ๆ นอกจากนี้ยังมีเครื่องมือสร้างโค้ดที่เรียกว่า Gii ซึ่งมีตัวสร้างอินเทอร์เฟซ CRUD (Create-Read-Update-Delete) แบบเต็ม
คุณสมบัติหลัก
คุณสมบัติหลักของ Yii มีดังนี้ -
- Yii ใช้รูปแบบสถาปัตยกรรม MVC
- มีคุณสมบัติสำหรับทั้งฐานข้อมูลเชิงสัมพันธ์และ NoSQL
- Yii ไม่เคยออกแบบสิ่งต่างๆมากเกินไปเพื่อจุดประสงค์เดียวในการทำตามรูปแบบการออกแบบบางอย่าง
- สามารถขยายได้มาก
- Yii ให้การสนับสนุนการแคชหลายชั้น
- Yii ให้การสนับสนุนการพัฒนา RESTful API
- มีประสิทธิภาพสูง
โดยรวมแล้วหากสิ่งที่คุณต้องการคืออินเทอร์เฟซที่เป็นระเบียบสำหรับฐานข้อมูลพื้นฐาน Yii คือตัวเลือกที่เหมาะสม ปัจจุบัน Yii มีสองเวอร์ชัน: 1.1 และ 2.0
ขณะนี้เวอร์ชัน 1.1 อยู่ในโหมดการบำรุงรักษาและเวอร์ชัน 2 ใช้เทคโนโลยีล่าสุดซึ่งรวมถึงยูทิลิตี้ Composer สำหรับการแจกจ่ายแพ็คเกจ PSR ระดับ 1, 2 และ 4 และคุณสมบัติ PHP 5.4+ อีกมากมาย เป็นเวอร์ชัน 2 ที่จะได้รับความพยายามในการพัฒนาหลักในอีกไม่กี่ปีข้างหน้า
Yii เป็นเฟรมเวิร์ก OOP (Object-Oriented Programming) ที่บริสุทธิ์ ดังนั้นจึงต้องมีความรู้พื้นฐานเกี่ยวกับ OOP เฟรมเวิร์ก Yii ยังใช้คุณสมบัติล่าสุดของ PHP เช่นลักษณะและเนมสเปซ มันจะง่ายกว่าสำหรับคุณที่จะหยิบ Yii 2.0 ถ้าคุณเข้าใจแนวคิดเหล่านี้
สิ่งแวดล้อม
ข้อกำหนดหลักสำหรับ Yii2 คือ PHP 5.4+ และก web server. Yii เป็นเครื่องมือคอนโซลที่มีประสิทธิภาพซึ่งจัดการการย้ายฐานข้อมูลการรวบรวมสินทรัพย์และสิ่งอื่น ๆ ขอแนะนำให้มีการเข้าถึงบรรทัดคำสั่งไปยังเครื่องที่คุณพัฒนาแอปพลิเคชันของคุณ
เพื่อวัตถุประสงค์ในการพัฒนาเราจะใช้ -
- ลินุกซ์มิ้นต์ 17.1
- PHP 5.5.9
- PHP ในตัวเว็บเซิร์ฟเวอร์
ตรวจสอบก่อนการติดตั้ง
หากต้องการตรวจสอบว่าเครื่องในพื้นที่ของคุณใช้งานได้กับ Yii2 เวอร์ชันล่าสุดหรือไม่ให้ทำดังต่อไปนี้ -
Step 1 - ติดตั้ง php เวอร์ชันล่าสุด
sudo apt-get install php5
Step 2 - ติดตั้ง mysql เวอร์ชันล่าสุด
sudo apt-get install mysql-server
Step 3 - ดาวน์โหลดเทมเพลตแอปพลิเคชันพื้นฐาน Yii2
composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
Step 4- ในการเริ่มต้นเซิร์ฟเวอร์ในตัว PHP ภายในโฟลเดอร์พื้นฐานที่เรียกใช้
php -S localhost:8080
มีสคริปต์ที่เป็นประโยชน์ requirements.php. ตรวจสอบว่าเซิร์ฟเวอร์ของคุณตรงตามข้อกำหนดในการเรียกใช้แอปพลิเคชันหรือไม่ คุณสามารถค้นหาสคริปต์นี้ได้ในโฟลเดอร์รูทของแอปพลิเคชันของคุณ
![](https://post.nghiatu.com/assets/tutorial/yii/images/requirements_php.jpg)
ถ้าคุณพิมพ์ http://localhost:8080/requirements.php ในแถบที่อยู่ของเว็บเบราว์เซอร์หน้าที่มีลักษณะดังที่แสดงในภาพหน้าจอต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/run_requirements_php.jpg)
วิธีที่ตรงไปตรงมาที่สุดในการเริ่มต้นใช้งาน Yii2 คือการใช้เทมเพลตแอปพลิเคชันพื้นฐานที่ทีมงาน Yii2 จัดเตรียมไว้ให้ แม่แบบนี้สามารถใช้ได้ผ่านเครื่องมือ Composer
Step 1 - ค้นหาไดเร็กทอรีที่เหมาะสมในฮาร์ดไดรฟ์ของคุณและดาวน์โหลด Composer PHAR (ไฟล์เก็บถาวร PHP) ผ่านคำสั่งต่อไปนี้
curl -sS https://getcomposer.org/installer | php
Step 2 - จากนั้นย้ายไฟล์เก็บถาวรนี้ไปยังไดเร็กทอรี bin
mv composer.phar /usr/local/bin/composer
Step 3- เมื่อติดตั้ง Composer แล้วคุณสามารถติดตั้งเทมเพลตแอปพลิเคชันพื้นฐาน Yii2 ได้ เรียกใช้คำสั่งเหล่านี้
composer global require "fxp/composer-asset-plugin:~1.1.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic helloworld
คำสั่งแรกจะติดตั้งปลั๊กอินเนื้อหาของผู้แต่งซึ่งจัดการ npmและสนับสนุนการพึ่งพา คำสั่งที่สองติดตั้งเทมเพลตแอปพลิเคชันพื้นฐาน Yii2 ในไดเร็กทอรีที่เรียกว่าhelloworld.
Step 4 - ตอนนี้เปิดไฟล์ helloworld ไดเรกทอรีและเปิดเว็บเซิร์ฟเวอร์ที่สร้างขึ้นใน PHP
php -S localhost:8080 -t web
Step 5 - จากนั้นเปิด http://localhost:8080ในเบราว์เซอร์ของคุณ คุณสามารถดูหน้ายินดีต้อนรับ
![](https://post.nghiatu.com/assets/tutorial/yii/images/welcome_page.jpg)
ตอนนี้เราจะสร้างไฟล์ “Hello world”หน้าในใบสมัครของคุณ ในการสร้างเพจเราต้องสร้างการดำเนินการและมุมมอง
การดำเนินการถูกประกาศในตัวควบคุม ผู้ใช้ปลายทางจะได้รับผลการดำเนินการของการกระทำ
Step 1 - ประกาศการดำเนินการพูดในที่มีอยู่ SiteControllerซึ่งกำหนดไว้ใน class file controllers /SiteController.php.
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
/* other code */
public function actionSpeak($message = "default message") { return $this->render("speak",['message' => $message]);
}
}
?>
เรากำหนดการดำเนินการพูดเป็นวิธีการที่เรียกว่า actionSpeak. ใน Yii วิธีการดำเนินการทั้งหมดจะขึ้นต้นด้วยคำว่า action นี่คือวิธีที่กรอบการทำงานแยกวิธีการดำเนินการออกจากวิธีการที่ไม่ได้กระทำ หากรหัสการดำเนินการต้องการคำหลายคำรหัสดังกล่าวจะถูกต่อด้วยขีดกลาง ดังนั้นการเพิ่มโพสต์ ID การดำเนินการจึงสอดคล้องกับวิธีการดำเนินการactionAddPost.
ในรหัสที่ระบุด้านบนไฟล์ ‘out’ ฟังก์ชันรับพารามิเตอร์ GET $message. เรายังเรียกเมธอดที่ชื่อ‘render’เพื่อแสดงไฟล์มุมมองที่เรียกว่า speak เราส่งพารามิเตอร์ข้อความไปยังมุมมอง ผลลัพธ์การแสดงผลคือหน้า HTML ที่สมบูรณ์
Viewเป็นสคริปต์ที่สร้างเนื้อหาของการตอบกลับ สำหรับการดำเนินการพูดเราสร้างมุมมองการพูดที่พิมพ์ข้อความของเรา เมื่อเรียกเมธอดการเรนเดอร์จะมองหาชื่อไฟล์ PHP เป็นview/controllerID/vewName.php.
Step 2 - ดังนั้นภายในโฟลเดอร์ views / site จึงสร้างไฟล์ชื่อ speak.php ด้วยรหัสต่อไปนี้
<?php
use yii\helpers\Html;
?>
<?php echo Html::encode($message); ?>
โปรดทราบว่าเราเข้ารหัส HTML พารามิเตอร์ข้อความก่อนพิมพ์เพื่อหลีกเลี่ยง XSS โจมตี.
Step 3 - พิมพ์สิ่งต่อไปนี้ในเว็บเบราว์เซอร์ของคุณ http://localhost:8080/index.php?r=site/speak&message=hello%20world.
คุณจะเห็นหน้าต่างต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/speak_php_file.jpg)
‘r’พารามิเตอร์ใน URL ย่อมาจาก route รูปแบบเริ่มต้นของเส้นทางคือcontrollerID/actionID. ในกรณีของเราไซต์เส้นทาง / พูดจะได้รับการแก้ไขโดยSiteController ชั้นเรียนและการดำเนินการพูด
มีเพียงโฟลเดอร์เดียวในฐานรหัสโดยรวมที่เปิดเผยต่อสาธารณะสำหรับเว็บเซิร์ฟเวอร์ เป็นเว็บไดเร็กทอรี โฟลเดอร์อื่น ๆ นอกไดเร็กทอรีรากของเว็บไม่สามารถเข้าถึงได้สำหรับเว็บเซิร์ฟเวอร์
Note - การอ้างอิงโครงการทั้งหมดอยู่ในไฟล์ composer.jsonไฟล์. Yii2 มีแพ็คเกจสำคัญบางอย่างที่ Composer รวมอยู่ในโปรเจ็กต์ของคุณแล้ว แพ็คเกจเหล่านี้มีดังต่อไปนี้ -
- Gii - เครื่องมือสร้างรหัส
- คอนโซลการแก้ปัญหา
- กรอบการทดสอบ Codeception
- ไลบรารี SwiftMailer
- ไลบรารี Twitter Bootstrap UI
สามแพ็คเกจแรกมีประโยชน์ในสภาพแวดล้อมการพัฒนาเท่านั้น
โครงสร้างการใช้งานของ Yii2 มีความแม่นยำและชัดเจน ประกอบด้วยโฟลเดอร์ต่อไปนี้ -
Assets - โฟลเดอร์นี้รวมไฟล์. js และ. css ทั้งหมดที่อ้างถึงในเว็บเพจ
Commands - โฟลเดอร์นี้มีคอนโทรลเลอร์ที่สามารถใช้งานได้จากเทอร์มินัล
Config - โฟลเดอร์นี้ประกอบด้วยไฟล์ config ไฟล์สำหรับจัดการฐานข้อมูลแอปพลิเคชันและพารามิเตอร์แอปพลิเคชัน
Mail - โฟลเดอร์นี้มีเค้าโครงเมล
Models - โฟลเดอร์นี้รวมรุ่นที่ใช้ในแอปพลิเคชัน
Runtime - โฟลเดอร์นี้มีไว้สำหรับจัดเก็บข้อมูลรันไทม์
Tests - โฟลเดอร์นี้รวมการทดสอบทั้งหมด (การยอมรับหน่วยการทำงาน)
Vendor - โฟลเดอร์นี้มีแพ็คเกจของบุคคลที่สามทั้งหมดที่จัดการโดย Composer
Views- โฟลเดอร์นี้มีไว้สำหรับมุมมองที่แสดงโดยคอนโทรลเลอร์ รูปแบบโฟลเดอร์สำหรับแม่แบบหน้า
Web - จุดเริ่มต้นจากเว็บ
โครงสร้างการใช้งาน
ต่อไปนี้คือการแสดงแผนผังของโครงสร้างแอปพลิเคชัน
![](https://post.nghiatu.com/assets/tutorial/yii/images/application_structure.jpg)
Yii2 - วัตถุ
รายการต่อไปนี้มีวัตถุทั้งหมดของ Yii2 -
โมเดลมุมมองและคอนโทรลเลอร์
โมเดลมีไว้สำหรับการแสดงข้อมูล (โดยปกติจะมาจากฐานข้อมูล) มุมมองมีไว้สำหรับแสดงข้อมูล ตัวควบคุมใช้สำหรับประมวลผลคำขอและสร้างการตอบกลับ
ส่วนประกอบ
ในการสร้างฟังก์ชันที่ใช้ซ้ำได้ผู้ใช้สามารถเขียนส่วนประกอบของตนเองได้ ส่วนประกอบเป็นเพียงวัตถุที่ประกอบด้วยตรรกะ ตัวอย่างเช่นส่วนประกอบอาจเป็นตัวแปลงน้ำหนัก
ส่วนประกอบของแอปพลิเคชัน
สิ่งเหล่านี้เป็นวัตถุที่ติดตั้งเพียงครั้งเดียวในแอปพลิเคชันทั้งหมด ความแตกต่างที่สำคัญระหว่างส่วนประกอบและส่วนประกอบของแอปพลิเคชันคือส่วนประกอบหลังสามารถมีได้เพียงอินสแตนซ์เดียวในแอปพลิเคชันทั้งหมด
วิดเจ็ต
วิดเจ็ตเป็นวัตถุที่ใช้ซ้ำได้ซึ่งมีทั้งตรรกะและรหัสการแสดงผล วิดเจ็ตอาจเป็นตัวอย่างเช่นแถบเลื่อนแกลเลอรี
ฟิลเตอร์
ฟิลเตอร์คือออบเจ็กต์ที่ทำงานก่อนหรือหลังการเรียกใช้แอ็คชันคอนโทรลเลอร์
โมดูล
คุณสามารถพิจารณา Modules เป็นแอพย่อยที่ใช้ซ้ำได้ซึ่งมี Models, Views, Controllers และอื่น ๆ
ส่วนขยาย
ส่วนขยายเป็นแพ็คเกจที่นักแต่งเพลงสามารถจัดการได้
สคริปต์รายการมีหน้าที่เริ่มรอบการจัดการคำขอ เป็นเพียงสคริปต์ PHP ที่ผู้ใช้สามารถเข้าถึงได้
ภาพประกอบต่อไปนี้แสดงโครงสร้างของแอปพลิเคชัน -
![](https://post.nghiatu.com/assets/tutorial/yii/images/entry_scripts_structure.jpg)
เว็บแอปพลิเคชัน (เช่นเดียวกับแอปพลิเคชันคอนโซล) มีสคริปต์รายการเดียว ผู้ใช้ปลายทางร้องขอไปยังสคริปต์รายการ จากนั้นสคริปต์รายการจะสร้างอินสแตนซ์แอ็พพลิเคชันอินสแตนซ์และส่งต่อคำขอไปยังอินสแตนซ์
สคริปต์รายการสำหรับแอปพลิเคชันคอนโซลมักถูกเก็บไว้ในเส้นทางพื้นฐานของโครงการและตั้งชื่อเป็น yii.php. สคริปต์รายการสำหรับเว็บแอปพลิเคชันต้องจัดเก็บไว้ในไดเรกทอรีที่สามารถเข้าถึงได้บนเว็บ ซึ่งมักเรียกกันว่าindex.php.
สคริปต์รายการทำสิ่งต่อไปนี้ -
- กำหนดค่าคงที่
- ลงทะเบียนตัวโหลดอัตโนมัติของ Composer
- รวมไฟล์ Yii
- โหลดการกำหนดค่า
- สร้างและกำหนดค่าอินสแตนซ์ของแอปพลิเคชัน
- ดำเนินการตามคำขอที่เข้ามา
ต่อไปนี้เป็นสคริปต์รายการสำหรับ basic application แม่แบบ -
<?php
//defining global constants
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
//register composer autoloader
require(__DIR__ . '/../vendor/autoload.php');
//include yii files
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
//load application config
$config = require(__DIR__ . '/../config/web.php');
//create, config, and process reques
(new yii\web\Application($config))->run();
?>
ต่อไปนี้เป็นสคริปต์รายการสำหรับ console ใบสมัคร -
#!/usr/bin/env php
<?php
/**
* Yii console bootstrap file.
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
//defining global constants
defined('YII_DEBUG') or define('YII_DEBUG', true);
//register composer autoloader
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
//load config
$config = require(__DIR__ . '/config/console.php');
//apply config the application instance
$application = new yii\console\Application($config);
//process request
$exitCode = $application->run();
exit($exitCode);
?>
สถานที่ที่ดีที่สุดสำหรับการกำหนดค่าคงที่ส่วนกลางคือสคริปต์รายการ มีสามค่าที่รองรับโดยค่าคงที่ Yii -
YII_DEBUG- กำหนดว่าคุณอยู่ในโหมดดีบักหรือไม่ หากตั้งค่าเป็นจริงเราจะเห็นข้อมูลบันทึกเพิ่มเติมและสแต็กการเรียกข้อผิดพลาดโดยละเอียด
YII_ENV- กำหนดโหมดสภาพแวดล้อม ค่าเริ่มต้นคือ prod ค่าที่ใช้ได้คือ prod, dev และ test ใช้ในไฟล์คอนฟิกูเรชันเพื่อกำหนดตัวอย่างเช่นการเชื่อมต่อ DB อื่น (โลคัลและรีโมต) หรือค่าอื่น ๆ
YII_ENABLE_ERROR_HANDLER - ระบุว่าจะเปิดใช้งานตัวจัดการข้อผิดพลาด Yii เริ่มต้นหรือไม่
ในการกำหนดค่าคงที่ส่วนกลางจะใช้รหัสต่อไปนี้ -
//defining global constants
defined('YII_DEBUG') or define('YII_DEBUG', true);
which is equivalent to:
if(!defined('YII_DEBUG')) {
define('YII_DEBUG', true);
}
Note - ควรกำหนดค่าคงที่ส่วนกลางที่จุดเริ่มต้นของสคริปต์รายการเพื่อให้มีผลเมื่อรวมไฟล์ PHP อื่น ๆ
ตัวควบคุมมีหน้าที่ในการประมวลผลคำขอและสร้างการตอบกลับ หลังจากคำขอของผู้ใช้คอนโทรลเลอร์จะวิเคราะห์ข้อมูลคำขอส่งผ่านไปยังโมเดลจากนั้นแทรกผลลัพธ์โมเดลลงในมุมมองและสร้างการตอบกลับ
การทำความเข้าใจการกระทำ
ตัวควบคุมรวมถึงการกระทำ เป็นหน่วยพื้นฐานที่ผู้ใช้สามารถร้องขอให้ดำเนินการได้ คอนโทรลเลอร์สามารถมีการดำเนินการอย่างใดอย่างหนึ่งหรือหลายอย่าง
ให้เราดูที่ SiteController ของเทมเพลตแอปพลิเคชันพื้นฐาน -
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
public function actions() {
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
public function actionIndex() {
return $this->render('index');
}
public function actionLogin() {
if (!\Yii::$app->user->isGuest) { return $this->goHome();
}
$model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack(); } return $this->render('login', [
'model' => $model, ]); } public function actionLogout() { Yii::$app->user->logout();
return $this->goHome(); } public function actionContact() { //load ContactForm model $model = new ContactForm();
//if there was a POST request, then try to load POST data into a model
if ($model->load(Yii::$app->request->post()) && $model>contact(Yii::$app->params
['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh();
}
return $this->render('contact', [ 'model' => $model,
]);
}
public function actionAbout() {
return $this->render('about'); } public function actionSpeak($message = "default message") {
return $this->render("speak",['message' => $message]);
}
}
?>
เรียกใช้เทมเพลตแอปพลิเคชันพื้นฐานโดยใช้เซิร์ฟเวอร์ในตัวของ PHP และไปที่เว็บเบราว์เซอร์ที่ http://localhost:8080/index.php?r=site/contact. คุณจะเห็นหน้าต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/run_basic_application.jpg)
เมื่อคุณเปิดหน้านี้การดำเนินการติดต่อของไฟล์ SiteControllerถูกดำเนินการ รหัสจะโหลดไฟล์ContactFormแบบ. จากนั้นจะแสดงมุมมองผู้ติดต่อและส่งผ่านโมเดลเข้าไป
![](https://post.nghiatu.com/assets/tutorial/yii/images/contact_form_model.jpg)
หากคุณกรอกแบบฟอร์มและคลิกปุ่มส่งคุณจะเห็นสิ่งต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/submit_form.jpg)
สังเกตว่าเวลานี้รหัสต่อไปนี้จะถูกเรียกใช้ -
if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app>params ['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh();
}
หากมีคำขอ POST เราจะกำหนดข้อมูล POST ให้กับโมเดลและพยายามส่งอีเมล หากเราประสบความสำเร็จเราจะตั้งค่าข้อความแฟลชพร้อมข้อความ "ขอบคุณที่ติดต่อเรา เราจะตอบกลับคุณโดยเร็วที่สุด” และรีเฟรชหน้า
การทำความเข้าใจเส้นทาง
ในตัวอย่างข้างต้นใน URL http://localhost:8080/index.php?r=site/contact, เส้นทางคือ site/contact. การดำเนินการติดต่อ (actionContact) ใน SiteController จะถูกดำเนินการ
เส้นทางประกอบด้วยส่วนต่างๆต่อไปนี้ −
moduleID - หากคอนโทรลเลอร์เป็นของโมดูลแสดงว่าเส้นทางนี้มีอยู่
controllerID (ไซต์ในตัวอย่างด้านบน) - สตริงเฉพาะที่ระบุตัวควบคุมระหว่างตัวควบคุมทั้งหมดภายในโมดูลหรือแอปพลิเคชันเดียวกัน
actionID (ผู้ติดต่อในตัวอย่างด้านบน) - สตริงเฉพาะที่ระบุการกระทำระหว่างการกระทำทั้งหมดภายในคอนโทรลเลอร์เดียวกัน
รูปแบบของเส้นทางคือ controllerID/actionID. หากคอนโทรลเลอร์เป็นของโมดูลแสดงว่ามีรูปแบบดังต่อไปนี้:moduleID/controllerID/actionID.
ตัวควบคุมในเว็บแอปพลิเคชันควรขยายจาก yii\web\Controllerหรือชั้นเรียนลูกของมัน ในแอปพลิเคชันคอนโซลควรขยายจาก yii \ console \ Controller หรือคลาสลูกของมัน
ให้เราสร้างตัวควบคุมตัวอย่างในไฟล์ controllers โฟลเดอร์
Step 1 - ภายใน Controllers สร้างไฟล์ชื่อ ExampleController.php ด้วยรหัสต่อไปนี้
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actionIndex() {
$message = "index action of the ExampleController"; return $this->render("example",[
'message' => $message
]);
}
}
?>
Step 2 - สร้างมุมมองตัวอย่างในไฟล์ views/exampleโฟลเดอร์ ภายในโฟลเดอร์นั้นให้สร้างไฟล์ชื่อexample.php ด้วยรหัสต่อไปนี้
<?php
echo $message;
?>
แต่ละแอปพลิเคชันมีตัวควบคุมเริ่มต้น สำหรับเว็บแอปพลิเคชันไซต์เป็นตัวควบคุมในขณะที่แอปพลิเคชันคอนโซลเป็นความช่วยเหลือ ดังนั้นเมื่อhttp://localhost:8080/index.phpURL ถูกเปิดขึ้นผู้ควบคุมไซต์จะจัดการคำขอ คุณสามารถเปลี่ยนตัวควบคุมเริ่มต้นในการกำหนดค่าแอปพลิเคชัน
พิจารณารหัสที่กำหนด -
'defaultRoute' => 'main'
Step 3 - เพิ่มรหัสด้านบนต่อไปนี้ config/web.php.
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is
//required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
//changing the default controller
'defaultRoute' => 'example',
'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
?>
Step 4 - ประเภท http://localhost:8080/index.php ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นว่าตัวควบคุมเริ่มต้นคือตัวควบคุมตัวอย่าง
![](https://post.nghiatu.com/assets/tutorial/yii/images/controller_example.jpg)
Note - รหัสคอนโทรลเลอร์ควรมีตัวอักษรภาษาอังกฤษเป็นตัวพิมพ์เล็กตัวเลขเครื่องหมายทับยัติภังค์และขีดล่าง
ในการแปลง ID คอนโทรลเลอร์เป็นชื่อคลาสคอนโทรลเลอร์คุณควรทำสิ่งต่อไปนี้ -
- นำอักษรตัวแรกจากทุกคำคั่นด้วยขีดกลางแล้วเปลี่ยนเป็นตัวพิมพ์ใหญ่
- ลบขีดกลาง
- แทนที่เครื่องหมายทับด้วยเครื่องหมายย้อนกลับ
- เพิ่มคำต่อท้ายตัวควบคุม
- นำหน้าเนมสเปซของคอนโทรลเลอร์
ตัวอย่าง
หน้ากลายเป็น app\controllers\PageController.
โพสต์บทความกลายเป็น app\controllers\PostArticleController.
ผู้ใช้ / โพสต์บทความกลายเป็น app\controllers\user\PostArticleController.
userBlogs / post-article กลายเป็น app\controllers\userBlogs\PostArticleController.
ในการสร้างแอ็คชันในคลาสคอนโทรลเลอร์คุณควรกำหนดเมธอดสาธารณะที่มีชื่อขึ้นต้นด้วย word action ข้อมูลส่งคืนของการดำเนินการแสดงถึงการตอบสนองที่จะส่งไปยังผู้ใช้ปลายทาง
Step 1 - ให้เรากำหนดการกระทำสวัสดีชาวโลกในไฟล์ ExampleController.
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actionIndex() {
$message = "index action of the ExampleController"; return $this->render("example",[
'message' => $message
]);
}
public function actionHelloWorld() {
return "Hello world!";
}
}
?>
Step 2 - ประเภท http://localhost:8080/index.php?r=example/hello-worldในแถบที่อยู่ของเว็บเบราว์เซอร์ คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/hello_world_action.jpg)
รหัสการดำเนินการมักเป็นคำกริยาเช่นสร้างอัปเดตลบและอื่น ๆ เนื่องจากการกระทำมักได้รับการออกแบบมาเพื่อทำการเปลี่ยนแปลงเฉพาะหากทรัพยากร
รหัสการดำเนินการควรมีเฉพาะอักขระเหล่านี้ - ตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กตัวเลขขีดกลางและขีดล่าง
การดำเนินการมีสองประเภท: แบบอินไลน์และแบบสแตนด์อโลน
การดำเนินการแบบอินไลน์ถูกกำหนดไว้ในคลาสคอนโทรลเลอร์ ชื่อของการดำเนินการได้มาจากรหัสการดำเนินการด้วยวิธีนี้ -
- เปลี่ยนตัวอักษรตัวแรกในทุกคำของรหัสการกระทำให้เป็นตัวพิมพ์ใหญ่
- ลบขีดกลาง
- เพิ่มคำนำหน้าการดำเนินการ
Examples -
- ดัชนีกลายเป็น actionIndex
- hello-world (ตามตัวอย่างด้านบน) กลายเป็น actionHelloWorld
หากคุณวางแผนที่จะใช้การกระทำเดียวกันซ้ำในที่ต่างๆคุณควรกำหนดเป็นการดำเนินการแบบสแตนด์อโลน
สร้างคลาสการดำเนินการแบบสแตนด์อโลน
ในการสร้างคลาสแอ็คชันแบบสแตนด์อโลนคุณควรขยาย yii \ base \ Action หรือคลาสลูกและใช้ไฟล์ run() วิธี.
Step 1- สร้างโฟลเดอร์ส่วนประกอบภายในรูทโปรเจ็กต์ของคุณ ภายในโฟลเดอร์นั้นสร้างไฟล์ชื่อGreetingAction.php ด้วยรหัสต่อไปนี้
<?php
namespace app\components;
use yii\base\Action;
class GreetingAction extends Action {
public function run() {
return "Greeting";
}
}
?>
เราเพิ่งสร้างการดำเนินการที่ใช้ซ้ำได้ เพื่อใช้ในไฟล์ExampleControllerเราควรประกาศการกระทำของเราในแผนที่การกระทำโดยการแทนที่วิธีการดำเนินการ ()
Step 2 - แก้ไขไฟล์ ExampleController.php ยื่นด้วยวิธีนี้
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actions() {
return [
'greeting' => 'app\components\GreetingAction',
];
}
public function actionIndex() {
$message = "index action of the ExampleController";
return $this->render("example",[ 'message' => $message
]);
}
public function actionHelloWorld() {
return "Hello world!";
}
}
?>
actions() วิธีการส่งคืนอาร์เรย์ที่มีค่าเป็นชื่อคลาสและคีย์คือรหัสการดำเนินการ
Step 3 - ไปที่ http://localhost:8080/index.php?r=example/greeting. คุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/greeting_example.jpg)
Step 4- คุณยังสามารถใช้การดำเนินการเพื่อเปลี่ยนเส้นทางผู้ใช้ไปยัง URL อื่น ๆ เพิ่มการดำเนินการต่อไปนี้ในไฟล์ExampleController.php.
public function actionOpenGoogle() {
// redirect the user browser to http://google.com
return $this->redirect('http://google.com');
}
ตอนนี้ถ้าคุณเปิด http://localhost:8080/index.php?r=example/open-googleคุณจะถูกเปลี่ยนเส้นทางไปที่ http://google.com.
วิธีการดำเนินการสามารถใช้พารามิเตอร์ที่เรียกว่าพารามิเตอร์การกระทำ ค่าของพวกเขาถูกดึงมาจาก$_GET โดยใช้ชื่อพารามิเตอร์เป็นคีย์
Step 5 - เพิ่มการดำเนินการต่อไปนี้ในตัวควบคุมตัวอย่างของเรา
public function actionTestParams($first, $second) {
return "$first $second";
}
Step 6 - พิมพ์ URL http://localhost:8080/index.php?r=example/testparams&first=hello&second=world ในแถบที่อยู่ของเว็บเบราว์เซอร์ของคุณคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/run_hello_world_example.jpg)
ตัวควบคุมแต่ละตัวมีการดำเนินการเริ่มต้น เมื่อเส้นทางมีเฉพาะ ID คอนโทรลเลอร์หมายความว่ามีการร้องขอการดำเนินการเริ่มต้น โดยค่าเริ่มต้นการดำเนินการคือindex. คุณสามารถแทนที่คุณสมบัตินี้ได้อย่างง่ายดายในตัวควบคุม
Step 7 - ปรับเปลี่ยนไฟล์ ExampleController ทางนี้.
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public $defaultAction = "hello-world";
/* other actions */
}
?>
Step 8 - ทีนี้ถ้าคุณไปที่ http://localhost:8080/index.php?r=exampleคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/run_hello_world_example1.jpg)
เพื่อตอบสนองคำขอตัวควบคุมจะผ่านวงจรชีวิตดังต่อไปนี้ -
yii \ base \ Controller:init() เรียกว่าวิธีการ
ตัวควบคุมสร้างการดำเนินการตามรหัสการดำเนินการ
ตัวควบคุมเรียกตามลำดับว่า beforeAction() วิธีการของเว็บแอปพลิเคชันโมดูลและคอนโทรลเลอร์
ตัวควบคุมรันการดำเนินการ
ตัวควบคุมเรียกตามลำดับว่า afterAction() วิธีการของเว็บแอปพลิเคชันโมดูลและคอนโทรลเลอร์
แอปพลิเคชันกำหนดผลการดำเนินการให้กับการตอบสนอง
จุดสำคัญ
ตัวควบคุมควร -
- ผอมมาก การดำเนินการแต่ละอย่างควรมีโค้ดเพียงไม่กี่บรรทัด
- ใช้มุมมองสำหรับการตอบกลับ
- ไม่ฝัง HTML
- เข้าถึงข้อมูลคำขอ
- วิธีการโทรของแบบจำลอง
- ไม่ประมวลผลข้อมูลคำขอ สิ่งเหล่านี้ควรได้รับการประมวลผลในแบบจำลอง
โมเดลคือวัตถุที่แสดงถึงตรรกะและกฎทางธุรกิจ ในการสร้างแบบจำลองคุณควรขยายไฟล์yii\base\Model คลาสหรือคลาสย่อย
คุณลักษณะ
แอตทริบิวต์แสดงถึงข้อมูลทางธุรกิจ สามารถเข้าถึงได้เช่นองค์ประกอบอาร์เรย์หรือคุณสมบัติของวัตถุ แต่ละแอตทริบิวต์เป็นคุณสมบัติที่เข้าถึงได้โดยสาธารณะของแบบจำลอง ในการระบุแอตทริบิวต์ที่โมเดลมีอยู่คุณควรแทนที่ไฟล์yii\base\Model::attributes() วิธี.
ให้เราดูที่ ContactForm รูปแบบของเทมเพลตแอปพลิเคชันพื้นฐาน
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name;
public $email; public $subject;
public $body; public $verifyCode;
/**
* @return array the validation rules.
*/
public function rules() {
return [
// name, email, subject and body are required
[['name', 'email', 'subject', 'body'], 'required'],
// email has to be a valid email address
['email', 'email'],
// verifyCode needs to be entered correctly
['verifyCode', 'captcha'],
];
}
/**
* @return array customized attribute labels
*/
public function attributeLabels() {
return [
'verifyCode' => 'Verification Code',
];
}
/**
* Sends an email to the specified email address using the information
collected by this model.
* @param string $email the target email address * @return boolean whether the model passes validation */ public function contact($email) {
if ($this->validate()) { Yii::$app->mailer->compose()
->setTo($email) ->setFrom([$this->email => $this->name]) ->setSubject($this->subject)
->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
Step 1 - สร้างฟังก์ชันที่เรียกว่า actionShowContactModel ใน SiteController ด้วยรหัสต่อไปนี้
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm"; $mContactForm->email = "[email protected]";
$mContactForm->subject = "subject"; $mContactForm->body = "body";
var_dump($mContactForm);
}
ในโค้ดด้านบนเรากำหนดไฟล์ ContactForm โมเดลตั้งค่าคุณสมบัติและแสดงโมเดลบนหน้าจอ
Step 2 - ตอนนี้ถ้าคุณพิมพ์ http://localhost:8080/index.php?r=site/show-contact-model ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/show_contact_view.jpg)
หากโมเดลของคุณขยายจาก yii\base\Modelจากนั้นตัวแปรสมาชิกทั้งหมด (สาธารณะและไม่คงที่) เป็นแอตทริบิวต์ มีห้าคุณลักษณะในไฟล์ContactForm รุ่น - ชื่อ, อีเมล, หัวเรื่อง, เนื้อหา, verifyCode และคุณสามารถเพิ่มรายการใหม่ได้อย่างง่ายดาย
ป้ายกำกับแอตทริบิวต์
คุณมักจะต้องแสดงป้ายกำกับที่เกี่ยวข้องกับแอตทริบิวต์ โดยค่าเริ่มต้นป้ายกำกับแอตทริบิวต์จะถูกสร้างขึ้นโดยอัตโนมัติโดยไฟล์yii\base\Model::generateAttributeLabel()วิธี. หากต้องการประกาศป้ายกำกับแอตทริบิวต์ด้วยตนเองคุณสามารถแทนที่ไฟล์yii\base\Model::attributeLabels() วิธี.
Step 1 - หากคุณเปิด http://localhost:8080/index.php?r=site/contact, คุณจะเห็นหน้าต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/contact_form.jpg)
โปรดทราบว่าป้ายกำกับแอตทริบิวต์จะเหมือนกับชื่อ
Step 2 - ตอนนี้แก้ไขไฟล์ attributeLabels ฟังก์ชันใน ContactForm แบบจำลองด้วยวิธีต่อไปนี้
public function attributeLabels() {
return [
'name' => 'name overridden',
'email' => 'email overridden',
'subject' => 'subject overridden',
'body' => 'body overridden',
'verifyCode' => 'verifyCode overridden',
];
}
Step 3 - หากคุณเปิด http://localhost:8080/index.php?r=site/contact อีกครั้งคุณจะสังเกตเห็นว่าป้ายกำกับมีการเปลี่ยนแปลงดังที่แสดงในภาพต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/contact_form_changed.jpg)
สถานการณ์
คุณสามารถใช้โมเดลในสถานการณ์ต่างๆ ตัวอย่างเช่นเมื่อแขกต้องการส่งแบบฟอร์มติดต่อเราต้องการแอตทริบิวต์โมเดลทั้งหมด เมื่อผู้ใช้ต้องการทำสิ่งเดียวกันเขาก็เข้าสู่ระบบแล้วดังนั้นเราจึงไม่จำเป็นต้องใช้ชื่อของเขาเพราะเราสามารถนำมาจากฐานข้อมูล
ในการประกาศสถานการณ์เราควรลบล้างไฟล์ scenarios()ฟังก์ชัน จะส่งคืนอาร์เรย์ที่มีคีย์เป็นชื่อและค่าของสถานการณ์active attributes. แอททริบิวต์ที่ใช้งานเป็นสิ่งที่ต้องตรวจสอบ นอกจากนี้ยังสามารถmassively assigned.
Step 1 - แก้ไขไฟล์ ContactForm แบบจำลองด้วยวิธีต่อไปนี้
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name;
public $email; public $subject;
public $body; public $verifyCode;
const SCENARIO_EMAIL_FROM_GUEST = 'EMAIL_FROM_GUEST';
const SCENARIO_EMAIL_FROM_USER = 'EMAIL_FROM_USER';
public function scenarios() {
return [
self::SCENARIO_EMAIL_FROM_GUEST => ['name', 'email', 'subject',
'body', 'verifyCode'],
self::SCENARIO_EMAIL_FROM_USER => ['email' ,'subject', 'body',
'verifyCode'],
];
}
/**
* @return array the validation rules.
*/
public function rules() {
return [
// name, email, subject and body are required
[['name', 'email', 'subject', 'body'], 'required'],
// email has to be a valid email address
['email', 'email'],
// verifyCode needs to be entered correctly
['verifyCode', 'captcha'],
];
}
/**
* @return array customized attribute labels
*/
public function attributeLabels() {
return [
'name' => 'name overridden',
'email' => 'email overridden',
'subject' => 'subject overridden',
'body' => 'body overridden',
'verifyCode' => 'verifyCode overridden',
];
}
/**
* Sends an email to the specified email address using the information
collected by this model.
* @param string $email the target email address * @return boolean whether the model passes validation */ public function contact($email) {
if ($this -> validate()) { Yii::$app->mailer->compose()
->setTo($email) ->setFrom([$this->email => $this->name]) ->setSubject($this->subject)
->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
เราได้เพิ่มสองสถานการณ์ หนึ่งรายการสำหรับแขกและอีกรายการสำหรับผู้ใช้ที่ผ่านการรับรอง เมื่อผู้ใช้ได้รับการรับรองความถูกต้องเราไม่ต้องการชื่อของเขา
Step 2 - ตอนนี้แก้ไขไฟล์ actionContact ฟังก์ชันของ SiteController.
public function actionContact() {
$model = new ContactForm();
$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_GUEST; if ($model->load(Yii::$app->request->post()) && $model->
contact(Yii::$app->params ['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh(); } return $this->render('contact', [
'model' => $model,
]);
}
Step 3 - ประเภท http://localhost:8080/index.php?r=site/contactในเว็บเบราว์เซอร์ คุณจะสังเกตเห็นว่าปัจจุบันต้องมีแอตทริบิวต์โมเดลทั้งหมด
![](https://post.nghiatu.com/assets/tutorial/yii/images/required_model_attributes.jpg)
Step 4 - หากคุณเปลี่ยนสถานการณ์ของโมเดลในไฟล์ actionContactตามที่ระบุในรหัสต่อไปนี้คุณจะพบว่าแอตทริบิวต์ name ไม่จำเป็นอีกต่อไป
$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;
![](https://post.nghiatu.com/assets/tutorial/yii/images/change_scenario.jpg)
การมอบหมายงานจำนวนมาก
การกำหนดจำนวนมากเป็นวิธีที่สะดวกในการสร้างแบบจำลองจากแอตทริบิวต์อินพุตหลายรายการผ่านรหัสบรรทัดเดียว
บรรทัดของรหัสคือ -
$mContactForm = new \app\models\ContactForm; $mContactForm->attributes = \Yii::$app->request->post('ContactForm');
บรรทัดโค้ดข้างต้นเทียบเท่ากับ -
$mContactForm = new \app\models\ContactForm;
$postData = \Yii::$app->request->post('ContactForm', []);
$mContactForm->name = isset($postData['name']) ? $postData['name'] : null; $mContactForm->email = isset($postData['email']) ? $postData['email'] : null;
$mContactForm->subject = isset($postData['subject']) ? $postData['subject'] : null; $mContactForm->body = isset($postData['body']) ? $postData['body'] : null;
อดีตสะอาดกว่ามาก สังเกตว่าmassive assignment ใช้กับไฟล์ safe attributes. เป็นเพียงแอตทริบิวต์สถานการณ์ปัจจุบันที่แสดงอยู่ในไฟล์scenario() ฟังก์ชัน
การส่งออกข้อมูล
โมเดลมักจะต้องส่งออกในรูปแบบที่แตกต่างกัน ในการแปลงโมเดลเป็นอาร์เรย์ให้แก้ไขไฟล์actionShowContactModel ฟังก์ชันของ SiteController -
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm(); $mContactForm->name = "contactForm";
$mContactForm->email = "[email protected]"; $mContactForm->subject = "subject";
$mContactForm->body = "body"; var_dump($mContactForm->attributes);
}
ประเภท http://localhost:8080/index.php?r=site/show-contact-model ในแถบที่อยู่และคุณจะเห็นสิ่งต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/data_export.jpg)
ในการแปลง Model เป็น JSON แก้ไขรูปแบบ actionShowContactModel ฟังก์ชันดังต่อไปนี้ -
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm(); $mContactForm->name = "contactForm";
$mContactForm->email = "[email protected]"; $mContactForm->subject = "subject";
$mContactForm->body = "body"; return \yii\helpers\Json::encode($mContactForm);
}
Browser output -
{
"name":"contactForm",
"email":"[email protected]",
"subject":"subject",
"body":"body ",
"verifyCode":null
}
จุดสำคัญ
โมเดลมักจะเร็วกว่าคอนโทรลเลอร์ในแอปพลิเคชันที่ออกแบบมาอย่างดี แบบจำลองควร -
- มีตรรกะทางธุรกิจ
- มีกฎการตรวจสอบ
- มีแอตทริบิวต์
- ไม่ฝัง HTML
- ไม่เข้าถึงคำขอโดยตรง
- ไม่มีสถานการณ์มากเกินไป
วิดเจ็ตคือโค้ดฝั่งไคลเอ็นต์ที่ใช้ซ้ำได้ซึ่งประกอบด้วย HTML, CSS และ JS รหัสนี้มีตรรกะขั้นต่ำและรวมอยู่ในไฟล์yii\base\Widgetวัตถุ. เราสามารถแทรกและใช้วัตถุนี้ในทุกมุมมองได้อย่างง่ายดาย
Step 1 - หากต้องการดูวิดเจ็ตที่ใช้งานจริงให้สร้างไฟล์ actionTestWidget ฟังก์ชันใน SiteController ด้วยรหัสต่อไปนี้
public function actionTestWidget() {
return $this->render('testwidget');
}
ในตัวอย่างข้างต้นเราส่งคืนไฟล์ View เรียกว่า “testwidget”.
Step 2 - ตอนนี้ภายในโฟลเดอร์ views / site ให้สร้างไฟล์ View ที่เรียกว่า testwidget.php.
<?php
use yii\bootstrap\Progress;
?>
<?= Progress::widget(['percent' => 60, 'label' => 'Progress 60%']) ?>
Step 3 - หากคุณไปที่ http://localhost:8080/index.php?r=site/test-widget, คุณจะเห็นวิดเจ็ตแถบความคืบหน้า
![](https://post.nghiatu.com/assets/tutorial/yii/images/progress_bar.jpg)
การใช้วิดเจ็ต
ในการใช้วิดเจ็ตในไฟล์ Viewคุณควรโทรไปที่ไฟล์ yii\base\Widget::widget()ฟังก์ชัน ฟังก์ชันนี้ใช้อาร์เรย์คอนฟิกูเรชันสำหรับการเตรียมใช้งานวิดเจ็ต ในตัวอย่างก่อนหน้านี้เราได้แทรกแถบความคืบหน้าด้วยเปอร์เซ็นต์และติดป้ายพารามิเตอร์ของออบเจ็กต์การกำหนดค่า
วิดเจ็ตบางตัวใช้บล็อกเนื้อหา ควรอยู่ระหว่างyii\base\Widget::begin() และ yii\base\Widget::end()ฟังก์ชั่น. ตัวอย่างเช่นวิดเจ็ตต่อไปนี้แสดงแบบฟอร์มการติดต่อ -
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
'template' =>
'<div class="row">
<div class = "col-lg-3">{image}</div>
<div class = "col-lg-6">{input}</div>
</div>',
]) ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'contact-button']) ?>
</div>
<?php ActiveForm::end(); ?>
การสร้างวิดเจ็ต
ในการสร้างวิดเจ็ตคุณควรขยายจาก yii\base\Widget. จากนั้นคุณควรลบล้างไฟล์yii\base\Widget::init() และ yii\base\Widget::run()ฟังก์ชั่น. run()ฟังก์ชันควรส่งคืนผลลัพธ์การแสดงผล init() ฟังก์ชันควรทำให้คุณสมบัติวิดเจ็ตเป็นปกติ
Step 1- สร้างโฟลเดอร์ส่วนประกอบในรูทโครงการ ภายในโฟลเดอร์นั้นให้สร้างไฟล์ชื่อFirstWidget.php ด้วยรหัสต่อไปนี้
<?php
namespace app\components;
use yii\base\Widget;
class FirstWidget extends Widget {
public $mes; public function init() { parent::init(); if ($this->mes === null) {
$this->mes = 'First Widget'; } } public function run() { return "<h1>$this->mes</h1>";
}
}
?>
Step 2 - Modify ที่ testwidget ดูด้วยวิธีต่อไปนี้
<?php
use app\components\FirstWidget;
?>
<?= FirstWidget∷widget() ?>
Step 3 - ไปที่ http://localhost:8080/index.php?r=site/test-widget. คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/first_widget.jpg)
Step 4 - ในการใส่เนื้อหาระหว่างไฟล์ begin() และ end() คุณควรแก้ไขไฟล์ FirstWidget.php ไฟล์.
<?php
namespace app\components;
use yii\base\Widget;
class FirstWidget extends Widget {
public function init() {
parent::init();
ob_start();
}
public function run() {
$content = ob_get_clean(); return "<h1>$content</h1>";
}
}
?>
Step 5- ตอนนี้แท็ก h1 จะล้อมรอบเนื้อหาทั้งหมด สังเกตว่าเราใช้ไฟล์ob_start()ฟังก์ชั่นเพื่อบัฟเฟอร์เอาต์พุต แก้ไขมุมมอง testwidget ตามที่ระบุในโค้ดต่อไปนี้
<?php
use app\components\FirstWidget;
?>
<?php FirstWidget::begin(); ?>
First Widget in H1
<?php FirstWidget::end(); ?>
คุณจะเห็นผลลัพธ์ต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/h1_first_widget.jpg)
จุดสำคัญ
วิดเจ็ตควร -
สร้างตามรูปแบบ MVC คุณควรเก็บเลเยอร์การนำเสนอไว้ในมุมมองและตรรกะในคลาสวิดเจ็ต
ได้รับการออกแบบให้มีอยู่ในตัว ผู้พัฒนาควรจะออกแบบเป็น View ได้
โมดูลคือเอนทิตีที่มีโมเดลมุมมองตัวควบคุมและโมดูลอื่น ๆ ของตนเอง มันเป็นแอพพลิเคชั่นภายในแอพพลิเคชั่น
Step 1 - สร้างโฟลเดอร์ชื่อ modulesภายในรูทโปรเจ็กต์ของคุณ ภายในโฟลเดอร์โมดูลสร้างโฟลเดอร์ชื่อhello. นี่จะเป็นโฟลเดอร์พื้นฐานสำหรับโมดูล Hello ของเรา
Step 2 - ภายใน hello โฟลเดอร์สร้างไฟล์ Hello.php ด้วยรหัสต่อไปนี้
<?php
namespace app\modules\hello;
class Hello extends \yii\base\Module {
public function init() {
parent::init();
}
}
?>
เราเพิ่งสร้างคลาสโมดูล สิ่งนี้ควรอยู่ใต้เส้นทางฐานของโมดูล ทุกครั้งที่เข้าถึงโมดูลจะมีการสร้างอินสแตนซ์ของคลาสโมดูลผู้สื่อข่าว init() ฟังก์ชันมีไว้สำหรับการเริ่มต้นคุณสมบัติของโมดูล
Step 3- ตอนนี้เพิ่มอีกสองไดเรกทอรีภายในโฟลเดอร์ hello - ตัวควบคุมและมุมมอง เพิ่มCustomController.php ไฟล์ไปยังโฟลเดอร์ของคอนโทรลเลอร์
<?php
namespace app\modules\hello\controllers;
use yii\web\Controller;
class CustomController extends Controller {
public function actionGreet() {
return $this->render('greet');
}
}
?>
เมื่อสร้างโมดูลหลักการคือการใส่คลาสคอนโทรลเลอร์ลงในไดเร็กทอรีของคอนโทรลเลอร์ของพา ธ ฐานของโมดูล เราเพิ่งกำหนดไฟล์actionGreet ซึ่งจะส่งกลับค่า greet ดู.
ควรใส่มุมมองในโมดูลไว้ในโฟลเดอร์มุมมองของพา ธ ฐานของโมดูล หากมุมมองถูกแสดงโดยคอนโทรลเลอร์ควรอยู่ในโฟลเดอร์ที่ตรงกับไฟล์controllerID. เพิ่มcustom ไปยังไฟล์ views โฟลเดอร์
Step 4 - ภายในไดเร็กทอรีที่กำหนดเองสร้างไฟล์ชื่อ greet.php ด้วยรหัสต่อไปนี้
<h1>Hello world from custom module!</h1>
เราเพิ่งสร้างไฟล์ View สำหรับพวกเรา actionGreet. ในการใช้โมดูลที่สร้างขึ้นใหม่นี้เราควรกำหนดค่าแอปพลิเคชัน เราควรเพิ่มโมดูลของเราในคุณสมบัติโมดูลของแอปพลิเคชัน
Step 5 - แก้ไขไฟล์ config/web.php ไฟล์.
<?php
$params = require(__DIR__ . '/params.php');
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is //required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'db' => require(__DIR__ . '/db.php'), ], 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
เส้นทางสำหรับคอนโทรลเลอร์ของโมดูลต้องเริ่มต้นด้วย ID โมดูลตามด้วย ID คอนโทรลเลอร์และ ID การดำเนินการ
Step 6 - ในการเรียกใช้ไฟล์ actionGreet ในแอปพลิเคชันของเราเราควรใช้เส้นทางต่อไปนี้
hello/custom/greet
โดยที่ hello เป็นรหัสโมดูลกำหนดเองคือไฟล์ controller ID และทักทายคือ action ID.
Step 7 - ตอนนี้พิมพ์ http://localhost:8080/index.php?r=hello/custom/greet และคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/custom_module.jpg)
จุดสำคัญ
โมดูลควร -
ใช้ในงานขนาดใหญ่ คุณควรแบ่งคุณสมบัติออกเป็นหลายกลุ่ม แต่ละกลุ่มคุณลักษณะสามารถพัฒนาเป็นโมดูล
นำกลับมาใช้ใหม่ได้ คุณสมบัติที่ใช้กันทั่วไปบางอย่างเช่นการจัดการ SEO หรือการจัดการบล็อกสามารถพัฒนาเป็นโมดูลเพื่อให้คุณสามารถนำมาใช้ซ้ำในโครงการในอนาคตได้อย่างง่ายดาย
มุมมองมีหน้าที่ในการนำเสนอข้อมูลให้กับผู้ใช้ปลายทาง ในเว็บแอปพลิเคชันViews เป็นเพียงไฟล์สคริปต์ PHP ที่มีโค้ด HTML และ PHP
การสร้างมุมมอง
Step 1 - ให้เราดูที่ไฟล์ ‘About’ มุมมองของเทมเพลตแอปพลิเคชันพื้นฐาน
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;
$this->title = 'About'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-about"> <h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<code><?= __FILE__ ?></code>
</div>
$this ตัวแปรหมายถึงส่วนประกอบมุมมองที่จัดการและแสดงผลเทมเพลตมุมมองนี้
นี่คือวิธีการ ‘About’ หน้าดูเหมือน -
![](https://post.nghiatu.com/assets/tutorial/yii/images/about_page.jpg)
สิ่งสำคัญคือต้องเข้ารหัสและ / หรือกรองข้อมูลที่มาจากผู้ใช้ปลายทางเพื่อหลีกเลี่ยงการโจมตี XSS คุณควรเข้ารหัสข้อความธรรมดาโดยการโทรyii\helpers\Html::encode() และเนื้อหา HTML โดยการโทร yii\helpers\HtmlPurifier.
Step 2 - แก้ไขไฟล์ ‘About’ ดูด้วยวิธีต่อไปนี้
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
$this->title = 'About'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-about"> <h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<p>
<?= Html::encode("<script>alert('alert!');</script><h1>ENCODE EXAMPLE</h1>>") ?>
</p>
<p>
<?= HtmlPurifier::process("<script>alert('alert!');</script><h1> HtmlPurifier EXAMPLE</h1>") ?>
</p>
<code><?= __FILE__ ?></code>
</div>
Step 3 - ตอนนี้พิมพ์ http://localhost:8080/index.php?r=site/about. คุณจะเห็นหน้าจอต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/about_view.jpg)
สังเกตว่าโค้ดจาวาสคริปต์ภายในไฟล์ Html::encode()ฟังก์ชันจะแสดงเป็นข้อความธรรมดา สิ่งเดียวกันสำหรับHtmlPurifier::process()โทร. แสดงเฉพาะแท็ก h1
มุมมองเป็นไปตามอนุสัญญาเหล่านี้ -
มุมมองซึ่งแสดงโดยคอนโทรลเลอร์ควรใส่ไว้ในไฟล์ @app/views/controllerID โฟลเดอร์
มุมมองซึ่งแสดงในวิดเจ็ตควรใส่ไว้ในไฟล์ widgetPath/views folder.
ในการสร้างไฟล์ view within a controller, คุณอาจใช้วิธีการต่อไปนี้ -
render() - แสดงมุมมองและใช้เค้าโครง
renderPartial() - แสดงมุมมองโดยไม่มีเค้าโครง
renderAjax() - แสดงมุมมองที่ไม่มีเค้าโครง แต่ฉีดไฟล์ js และ css ที่ลงทะเบียนทั้งหมด
renderFile() - แสดงมุมมองในเส้นทางไฟล์หรือนามแฝงที่กำหนด
renderContent() - แสดงผลสตริงคงที่และใช้เค้าโครง
ในการสร้างไฟล์ view within another viewคุณสามารถใช้วิธีการต่อไปนี้ -
render() - แสดงมุมมอง
renderAjax() - แสดงมุมมองที่ไม่มีเค้าโครง แต่ฉีดไฟล์ js และ css ที่ลงทะเบียนทั้งหมด
renderFile() - แสดงมุมมองในเส้นทางไฟล์หรือนามแฝงที่กำหนด
Step 4 - ภายในโฟลเดอร์ views / site สร้างไฟล์มุมมองสองไฟล์: _part1.php and _part2.php.
_part1.php -
<h1>PART 1</h1>
_part2.php -
<h1>PART 2</h1>
Step 5 - สุดท้ายแสดงมุมมองที่สร้างขึ้นใหม่ทั้งสองนี้ภายในไฟล์ ‘About’ ดู.
<?php
/* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1> <p> This is the About page. You may modify the following file to customize its content: </p> <?= $this->render("_part1") ?>
<?= $this->render("_part2") ?>
<code><?= __FILE__ ?></code>
</div>
คุณจะเห็นผลลัพธ์ต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_view_files.jpg)
เมื่อแสดงมุมมองคุณสามารถกำหนดมุมมองโดยใช้เป็นชื่อมุมมองหรือเส้นทาง / นามแฝงของไฟล์มุมมอง ชื่อมุมมองได้รับการแก้ไขด้วยวิธีต่อไปนี้ -
ชื่อข้อมูลพร็อพเพอร์ตี้สามารถละเว้นส่วนขยายได้ ตัวอย่างเช่นมุมมอง about สอดคล้องกับไฟล์ about.php
หากชื่อมุมมองขึ้นต้นด้วย“ /” ดังนั้นหากโมดูลที่ใช้งานอยู่ในขณะนี้คือฟอรัมและชื่อมุมมองคือความคิดเห็น / โพสต์เส้นทางจะเป็น @ app / module / forum / views / comment / post หากไม่มีโมดูลที่ใช้งานเส้นทางจะเป็น @ app / views / comment / post
หากชื่อข้อมูลพร็อพเพอร์ตี้ขึ้นต้นด้วย“ //” เส้นทางที่เกี่ยวข้องจะเป็น @ app / views / ViewName ตัวอย่างเช่น // site / contact สอดคล้องกับ @ app / views / site / contact.php
หากชื่อมุมมองเป็นผู้ติดต่อและตัวควบคุมบริบทคือ SiteController เส้นทางจะเป็น @ app / views / site / contact.php
หากมุมมองราคาถูกแสดงในมุมมองสินค้าราคาจะได้รับการแก้ไขเป็น @ app / views / invoice / price.php หากแสดงผลใน @ app / views / invoice / goods.php
การเข้าถึงข้อมูลในมุมมอง
ในการเข้าถึงข้อมูลภายในข้อมูลพร็อพเพอร์ตี้คุณควรส่งข้อมูลเป็นพารามิเตอร์ที่สองไปยังเมธอดการแสดงผลมุมมอง
Step 1 - แก้ไขไฟล์ actionAbout ของ SiteController.
public function actionAbout() {
$email = "[email protected]";
$phone = "+78007898100"; return $this->render('about',[
'email' => $email, 'phone' => $phone
]);
}
ในโค้ดที่ระบุข้างต้นเราส่งผ่านตัวแปรสองตัว $email และ $phone เพื่อแสดงผลในไฟล์ About ดู.
Step 2 - เปลี่ยนรหัสเกี่ยวกับมุมมอง
<?php
/* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class = "site-about">
<h1><?= Html::encode($this->title) ?></h1> <p> This is the About page. You may modify the following file to customize its content: </p> <p> <b>email:</b> <?= $email ?>
</p>
<p>
<b>phone:</b> <?= $phone ?>
</p>
<code><?= __FILE__ ?></code>
</div>
เราเพิ่งเพิ่มตัวแปรสองตัวที่เราได้รับจากไฟล์ SiteController.
Step 3 - พิมพ์ URL http://localhost:8080/index.php?r=site/about ในเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/change_about_view_code.jpg)
เลย์เอาต์แสดงถึงส่วนทั่วไปของหลายมุมมองเช่นส่วนหัวและส่วนท้ายของหน้า โดยค่าเริ่มต้นเค้าโครงควรเก็บไว้ในไฟล์views/layouts โฟลเดอร์
ให้เราดูที่เค้าโครงหลักของเทมเพลตแอปพลิเคชันพื้นฐาน -
<?php
/* @var $this \yii\web\View */
/* @var $content string */ use yii\helpers\Html; use yii\bootstrap\Nav; use yii\bootstrap\NavBar; use yii\widgets\Breadcrumbs; use app\assets\AppAsset; AppAsset::register($this);
?>
<?php $this->beginPage() ?> <!DOCTYPE html> <html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>"> <meta name = "viewport" content = "width = device-width, initial-scale = 1"> <?= Html::csrfMetaTags() ?> <title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?> </head> <body> <?php $this->beginBody() ?>
<div class = "wrap">
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl, 'options' => [ 'class' => 'navbar-inverse navbar-fixed-top', ], ]); echo Nav::widget([ 'options' => ['class' => 'navbar-nav navbar-right'], 'items' => [ ['label' => 'Home', 'url' => ['/site/index']], ['label' => 'About', 'url' => ['/site/about']], ['label' => 'Contact', 'url' => ['/site/contact']], Yii::$app->user->isGuest ?
['label' => 'Login', 'url' => ['/site/login']] :
[
'label' => 'Logout (' . Yii::$app->user->identity->username.')', 'url' => ['/site/logout'], 'linkOptions' => ['data-method' => 'post'] ], ], ]); NavBar::end(); ?> <div class = "container"> <?= Breadcrumbs::widget([ 'links' => isset($this->params['breadcrumbs']) ? $this>params ['breadcrumbs'] : [], ]) ?> <?= $content ?>
</div>
</div>
<footer class = "footer">
<div class = "container">
<p class = "pull-left">© My Company <?= date('Y') ?></p>
<p class = "pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?> </body> </html> <?php $this->endPage() ?>
เค้าโครงนี้สร้างเพจ HTML ที่ใช้ร่วมกันสำหรับทุกเพจ $contentตัวแปรคือผลการแสดงผลของการดูเนื้อหา วิธีการต่อไปนี้จะทริกเกอร์เหตุการณ์เกี่ยวกับกระบวนการแสดงผลเพื่อให้สามารถแทรกสคริปต์และแท็กที่ลงทะเบียนไว้ในที่อื่นได้อย่างเหมาะสม -
head()- ควรเรียกภายในส่วนหัว สร้างตัวยึดตำแหน่งซึ่งจะถูกแทนที่ด้วย HTML ที่ลงทะเบียนซึ่งกำหนดเป้าหมายไว้ที่ตำแหน่งส่วนหัว
beginBody()- ควรเรียกที่จุดเริ่มต้นของส่วนของร่างกาย ทริกเกอร์EVENT_BEGIN_BODYเหตุการณ์. สร้างตัวยึดตำแหน่งซึ่งจะถูกแทนที่ด้วย HTML ที่ลงทะเบียนซึ่งกำหนดเป้าหมายไว้ที่ตำแหน่งเริ่มต้นของเนื้อหา
endBody()- ควรเรียกที่ส่วนท้ายของส่วนลำตัว ทริกเกอร์EVENT_END_BODYเหตุการณ์. สร้างตัวยึดตำแหน่งซึ่งจะถูกแทนที่ด้วย HTML ที่ลงทะเบียนซึ่งกำหนดเป้าหมายไว้ที่ตำแหน่งสิ้นสุดของเนื้อหา
beginPage()- ควรเรียกที่จุดเริ่มต้นของเค้าโครง ทริกเกอร์EVENT_BEGIN_PAGE เหตุการณ์.
endPage()- ควรเรียกที่ส่วนท้ายของเค้าโครง ทริกเกอร์EVENT_END_PAGE เหตุการณ์.
สร้างเค้าโครง
Step 1 - ภายในไดเร็กทอรี views / layouts ให้สร้างไฟล์ชื่อ newlayout.php ด้วยรหัสต่อไปนี้
<?php
/* @var $this \yii\web\View */
/* @var $content string */ use yii\helpers\Html; use yii\bootstrap\Nav; use yii\bootstrap\NavBar; use yii\widgets\Breadcrumbs; use app\assets\AppAsset; AppAsset::register($this);
?>
<?php $this->beginPage() ?> <!DOCTYPE html> <html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>"> <meta name = "viewport" content = "width = device-width, initial-scale = 1"> <? = Html::csrfMetaTags() ?> <title><? = Html::encode($this->title) ?></title>
<?php $this->head() ?> </head> <body> <?php $this->beginBody() ?>
<div class = "wrap">
<div class = "container">
<? = $content ?> </div> </div> <footer class = "footer"> <div class = "container"> <p class = "pull-left">© My Company <?= date('Y') ?></p> <p class = "pull-right"><? = Yii::powered() ?></p> </div> </footer> <?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
เราได้ลบแถบเมนูด้านบนออก
Step 2 - ในการใช้เค้าโครงนี้กับไฟล์ SiteControllerเพิ่มไฟล์ $layout คุณสมบัติไปยัง SiteController ชั้นเรียน.
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
public $layout = “newlayout”;
/* other methods */
}
?>
Step 3 - ตอนนี้ถ้าคุณไปที่เว็บเบราว์เซอร์ที่มุมมองใด ๆ ของ SiteController คุณจะเห็นว่าเค้าโครงเปลี่ยนไป
![](https://post.nghiatu.com/assets/tutorial/yii/images/change_about_layout.jpg)
Step 4 - หากต้องการลงทะเบียนเมตาแท็กต่างๆคุณสามารถโทร yii\web\View::registerMetaTag() ในมุมมองเนื้อหา
Step 5 - แก้ไขไฟล์ ‘About’ มุมมองของ SiteController.
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;
$this->title = 'About'; $this->params['breadcrumbs'][] = $this->title; $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,
meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the description of this page!'], 'description'); ?> <div class="site-about"> <h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<code><?= __FILE__ ?></code>
</div>
เราเพิ่งลงทะเบียนเมตาแท็กสองรายการ - keywords and description.
Step 6 - ไปที่ http://localhost:8080/index.php?r=site/about, คุณจะพบเมตาแท็กในส่วนหัวของหน้าดังที่แสดงในภาพหน้าจอต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/meta_tags.jpg)
การดูทำให้เกิดเหตุการณ์ต่างๆ -
EVENT_BEGIN_BODY - เรียกใช้ในเลย์เอาต์โดยการเรียกของ yii\web\View::beginBody().
EVENT_END_BODY - เรียกใช้ในเลย์เอาต์โดยการเรียกของ yii\web\View::endBody().
EVENT_BEGIN_PAGE - เรียกใช้ในเลย์เอาต์โดยการเรียกของ yii\web\View::beginPage().
EVENT_END_PAGE - เรียกใช้ในเลย์เอาต์โดยการเรียกของ yii\web\View::endPage().
EVENT_BEFORE_RENDER - ทริกเกอร์ในคอนโทรลเลอร์ที่จุดเริ่มต้นของการแสดงไฟล์
EVENT_AFTER_RENDER - เรียกใช้หลังจากแสดงไฟล์
คุณอาจตอบสนองต่อเหตุการณ์เหล่านี้เพื่ออัดฉีดเนื้อหาเข้าสู่การดู
Step 7 - เพื่อแสดงวันที่และเวลาปัจจุบันในไฟล์ actionAbout ของ SiteControllerแก้ไขด้วยวิธีนี้
public function actionAbout() {
\Yii::$app->view->on(View::EVENT_BEGIN_BODY, function () { echo date('m.d.Y H:i:s'); }); return $this->render('about');
}
Step 8 - ประเภท http://localhost:8080/index.php?r=site/about ในแถบที่อยู่ของเว็บเบราว์เซอร์และคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/trigger_events_example.jpg)
จุดสำคัญ
เพื่อให้สามารถจัดการ Views ได้ง่ายขึ้นคุณควร -
- แบ่งมุมมองที่ซับซ้อนออกเป็นมุมมองเล็ก ๆ หลาย ๆ มุมมอง
- ใช้เลย์เอาต์สำหรับส่วน HTML ทั่วไป (ส่วนหัวส่วนท้ายเมนูและอื่น ๆ )
- ใช้วิดเจ็ต
มุมมองควร -
- มี HTML และโค้ด PHP ง่ายๆในการจัดรูปแบบและแสดงผลข้อมูล
- ไม่ดำเนินการตามคำขอ
- ไม่แก้ไขคุณสมบัติของโมเดล
- ไม่ดำเนินการสืบค้นฐานข้อมูล
เนื้อหาคือไฟล์ (css, js, วิดีโอ, เสียงหรือรูปภาพ ฯลฯ ) ที่อาจอ้างถึงในหน้าเว็บ Yii จัดการสินทรัพย์ในasset bundles. จุดประสงค์ของกลุ่มเนื้อหาคือการมีกลุ่มที่เกี่ยวข้องกันJS หรือ CSSไฟล์ในฐานรหัสและเพื่อให้สามารถลงทะเบียนได้ภายในการเรียก PHP เดียว กลุ่มเนื้อหายังขึ้นอยู่กับกลุ่มเนื้อหาอื่น ๆ
ภายในโฟลเดอร์ assets คุณจะพบชุดเนื้อหาสำหรับเทมเพลตแอปพลิเคชันพื้นฐาน -
<?php
namespace app\assets;
use yii\web\AssetBundle;
/**
* @author Qiang Xue <[email protected]>
* @since 2.0
*/
class AppAsset extends AssetBundle {
public $basePath = '@webroot'; public $baseUrl = '@web';
public $css = [ 'css/site.css', ]; public $js = [];
public $depends = [
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
];
}
?>
คลาสด้านบนระบุว่าไฟล์เนื้อหาอยู่ภายในไฟล์ @webroot โฟลเดอร์ซึ่งสอดคล้องกับ URL @web. กลุ่มประกอบด้วยหมายเลขJS ไฟล์และไฟล์ CSSไฟล์. บันเดิลขึ้นอยู่กับบันเดิลอื่น ๆ -
yii\web\YiiAsset and yii\bootstrap\BootstrapAsset.
คุณสมบัติของ AssetBundle
ต่อไปนี้เป็นคุณสมบัติของ AssetBundle
basePath - กำหนดไดเร็กทอรีที่เข้าถึงได้บนเว็บที่มีไฟล์เนื้อหาในบันเดิลนี้
baseUrl - ระบุ URL ที่สอดคล้องกับคุณสมบัติ basePath
js - กำหนดอาร์เรย์ของไฟล์ JS ที่อยู่ในบันเดิลนี้
css - กำหนดอาร์เรย์ของไฟล์ CSS ที่อยู่ในบันเดิลนี้
depends- กำหนดอาร์เรย์ของกลุ่มสินทรัพย์ที่บันเดิลนี้ขึ้นอยู่กับ หมายความว่าไฟล์ CSS และ JS ของบันเดิลสินทรัพย์ปัจจุบันจะรวมอยู่หลังบันเดิลซึ่งประกาศโดยไฟล์depends ทรัพย์สิน.
sourcePath- กำหนดไดเร็กทอรีรากที่มีไฟล์เนื้อหา คุณควรตั้งค่าคุณสมบัตินี้หากไดเรกทอรีรากไม่สามารถเข้าถึงเว็บได้ มิฉะนั้นคุณควรตั้งค่าไฟล์basePath และ baseUrl คุณสมบัติ.
cssOptions - กำหนดตัวเลือกที่จะส่งไปยังไฟล์ yii\web\View∷registerCssFile ฟังก์ชัน
jsOptions - กำหนดตัวเลือกที่จะส่งไปยังไฟล์ yii\web\View::registerJsFile ฟังก์ชัน
publishOptions: ระบุอ็อพชันที่จะถูกส่งไปยังไฟล์ yii\web\AssetManager::publish ฟังก์ชัน
การจัดประเภทสินทรัพย์
ขึ้นอยู่กับสถานที่ตั้งสินทรัพย์สามารถจัดประเภทเป็น -
Source Assets- เนื้อหาอยู่ในไดเรกทอรีที่ไม่สามารถเข้าถึงได้โดยตรงผ่านทางเว็บ ควรคัดลอกไปยังเว็บไดเร็กทอรีเพื่อใช้เนื้อหาต้นทางในเพจ กระบวนการนี้เรียกว่าasset publishing.
Published Assets - เนื้อหาอยู่ในไดเรกทอรีที่สามารถเข้าถึงได้ทางเว็บ
External Assets - ทรัพย์สินอยู่บนเว็บเซิร์ฟเวอร์อื่น
การใช้กลุ่มเนื้อหา
Step 1 - ภายใน assets สร้างไฟล์ใหม่ชื่อ DemoAsset.php โดยมีเนื้อหาดังต่อไปนี้
<?php
namespace app\assets;
use yii\web\AssetBundle;
class DemoAsset extends AssetBundle {
public $basePath = ‘@webroot’;
public $baseUrl = ‘@web’; public $js = [‘js/demo.js’];
}
?>
Step 2- เราเพิ่งประกาศชุดเนื้อหาใหม่พร้อมไฟล์ demo.js ไฟล์เดียว ตอนนี้ภายในโฟลเดอร์ web / js ให้สร้างไฟล์ชื่อ demo.js ด้วยรหัสนี้
console.log("hello from demo asset");
Step 3 - ในการลงทะเบียนกลุ่มสินทรัพย์ที่สร้างขึ้นใหม่ไปที่ไดเร็กทอรี views / layouts และที่ด้านบนของไฟล์ main.php ให้เพิ่มบรรทัดต่อไปนี้
\app\assets\DemoAsset::register($this);
Step 4 - หากชี้เว็บเบราว์เซอร์ของคุณไปที่ http://localhost:8080/index.phpคุณควรเห็นเอาต์พุตคอนโซลโครเมียมต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/using_asset_bundles.jpg)
คุณยังสามารถกำหนดไฟล์ jsOptions และ cssOptions คุณสมบัติในการปรับแต่งตามนั้น CSS และ JSไฟล์จะรวมอยู่ในเพจ โดยค่าเริ่มต้นไฟล์ JS จะรวมอยู่ก่อนแท็กเนื้อหาปิด
Step 5 - รวม JS ไฟล์ในส่วนหัวแก้ไขไฟล์ DemoAsset.php ไฟล์ด้วยวิธีต่อไปนี้
<?php
namespace app\assets;
use yii\web\AssetBundle;
use yii\web\View;
class DemoAsset extends AssetBundle {
public $basePath = '@webroot';
public $baseUrl = '@web'; public $js = ['js/demo.js'];
public $jsOptions = ['position' => View::POS_HEAD];
}
?>
Step 6 - ไปเลย to http://localhost:8080/index.php, คุณควรเห็นว่าไฟล์ demo.js สคริปต์รวมอยู่ในส่วนหัวของหน้า
![](https://post.nghiatu.com/assets/tutorial/yii/images/demoasset_php_file.jpg)
เป็นแนวทางปฏิบัติทั่วไปสำหรับเว็บแอปพลิเคชันที่ทำงานในโหมดการผลิตเพื่อเปิดใช้งานการแคช HTTP สำหรับเนื้อหา เมื่อทำเช่นนั้นการประทับเวลาของการแก้ไขครั้งล่าสุดจะถูกผนวกเข้ากับเนื้อหาที่เผยแพร่ทั้งหมด
Step 7 - ไปที่ไฟล์ config โฟลเดอร์และแก้ไขไฟล์ web.php ตามที่แสดงในรหัสต่อไปนี้
<?php
$params = require(__DIR__ . '/params.php');
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'assetManager' => [ 'appendTimestamp' => true, ], 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is //required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'db' => require(__DIR__ . '/db.php'), ], 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
เราได้เพิ่มไฟล์ AssetManager ส่วนประกอบและตั้งค่า appendTimestamp ทรัพย์สิน.
Step 8 - ตอนนี้พิมพ์ http://localhost:8080/index.phpในแถบที่อยู่ของเว็บเบราว์เซอร์ คุณจะสังเกตเห็นว่าตอนนี้เนื้อหาทั้งหมดมีการประทับเวลาดังที่แสดงในภาพต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/web_php_file.jpg)
กลุ่มสินทรัพย์หลัก Yii
ต่อไปนี้คือกลุ่มสินทรัพย์หลัก Yii
yii\web\JqueryAsset - รวมไฟล์ jquery.js
yii\web\YiiAsset - รวมไฟล์ yii.js ซึ่งใช้กลไกการจัดระเบียบโค้ด JS ในโมดูล
yii\bootstrap\BootstrapAsset - รวมไฟล์ CSS จากกรอบ Twitter Bootstrap
yii\bootstrap\BootstrapPluginAsset - รวมไฟล์ JS จากกรอบ Twitter Bootstrap
yii\jui\JuiAsset - รวมไฟล์ CSS และ JS จากไลบรารี jQuery UI
แทนที่จะเขียน CSS หรือ JS โค้ดนักพัฒนามักใช้ไวยากรณ์แบบขยายเช่น LESS, SCSS,Stylus สำหรับ CSS และ TypeScript, CoffeeScript สำหรับ JS จากนั้นพวกเขาใช้เครื่องมือพิเศษเพื่อแปลงไฟล์เหล่านี้เป็น CSS และ JS จริง
ตัวจัดการสินทรัพย์ใน Yii แปลงเนื้อหาในรูปแบบขยายเป็น CSS และ JS โดยอัตโนมัติ เมื่อแสดงผลมุมมองจะรวมไฟล์ CSS และ JS ไว้ในหน้าแทนที่จะเป็นเนื้อหาดั้งเดิมในไวยากรณ์เพิ่มเติม
Step 1 - แก้ไขไฟล์ DemoAsset.php ยื่นด้วยวิธีนี้
<?php
namespace app\assets;
use yii\web\AssetBundle;
use yii\web\View;
class DemoAsset extends AssetBundle {
public $basePath = '@webroot';
public $baseUrl = '@web'; public $js = [
'js/demo.js',
'js/greeting.ts'
];
public $jsOptions = ['position' => View::POS_HEAD];
}
?>
เราเพิ่งเพิ่มไฟล์ typescript
Step 2 - ภายใน web/js ไดเร็กทอรีสร้างไฟล์ชื่อ greeting.ts ด้วยรหัสต่อไปนี้
class Greeter {
constructor(public greeting: string) { }
greet() {
return this.greeting;
}
};
var greeter = new Greeter("Hello from typescript!");
console.log(greeter.greet());
ในโค้ดด้านบนเรากำหนดคลาสของ Greeter ด้วยวิธีการเดียว greet(). เราเขียนคำทักทายของเราไปที่คอนโซล Chrome
Step 3 - ไปที่ URL http://localhost:8080/index.php. คุณจะสังเกตเห็นว่าไฟล์greeting.ts ไฟล์จะถูกแปลงเป็นไฟล์ greeting.js ดังที่แสดงในภาพหน้าจอต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/greeting_ts_file.jpg)
ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/greeting_ts_file_output.jpg)
ส่วนขยายเป็นแพ็คเกจที่ออกแบบมาโดยเฉพาะเพื่อใช้ในแอปพลิเคชัน Yii คุณสามารถแชร์โค้ดของคุณเองเป็นส่วนขยายหรือใช้ส่วนขยายของบุคคลที่สามเพื่อเพิ่มคุณสมบัติให้กับแอปพลิเคชันของคุณ
การใช้ส่วนขยาย
ส่วนขยายส่วนใหญ่แจกจ่ายเป็นแพ็คเกจ Composer Composer ติดตั้งแพ็กเกจจาก Packagist - ที่เก็บสำหรับแพ็กเกจ Composer
ในการติดตั้งส่วนขยายของบุคคลที่สามคุณควร -
เพิ่มส่วนขยายลงในไฟล์ composer.json ไฟล์.
เรียกใช้การติดตั้งผู้แต่ง
การเพิ่มวิดเจ็ตวันที่และเวลา
ให้เราเพิ่มความเรียบร้อย datetime วิดเจ็ตสำหรับโครงการของเรา
Step 1 - แก้ไขไฟล์ composer.json ไฟล์ของเทมเพลตแอปพลิเคชันพื้นฐานด้วยวิธีนี้
{
"name": "yiisoft/yii2-app-basic",
"description": "Yii 2 Basic Project Template",
"keywords": ["yii2", "framework", "basic", "project template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "stable",
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.5",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"kartik-v/yii2-widget-datetimepicker": "*"
},
"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
"config": {
"process-timeout": 1800
},
"scripts": {
"post-create-project-cmd": [
"yii\\composer\\Installer::postCreateProject"
]
},
"extra": {
"yii\\composer\\Installer::postCreateProject": {
"setPermission": [
{
"runtime": "0777",
"web/assets": "0777",
"yii": "0755"
}
],
"generateCookieValidationKey": [
"config/web.php"
]
},
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}
เราได้เพิ่มการพึ่งพา "kartik-v/yii2-widget-datetimepicker": "*" ไปยังส่วนที่ต้องการ
Step 2 - ตอนนี้ภายในรูทโปรเจ็กต์ให้รันการอัปเดตผู้แต่งเพื่ออัปเดตการอ้างอิงทั้งหมด
![](https://post.nghiatu.com/assets/tutorial/yii/images/add_dependencies.jpg)
เราเพิ่งติดตั้งส่วนขยาย คุณจะพบได้ในไฟล์vendor/kartik-v/yii2widget-datetimepicker โฟลเดอร์
Step 3 - หากต้องการแสดงวิดเจ็ตที่ติดตั้งใหม่ในหน้าให้แก้ไขไฟล์ About มุมมองของ actionAbout วิธีการของ SiteController.
<?php
/* @var $this yii\web\View */
use kartik\datetime\DateTimePicker;
use yii\helpers\Html;
$this->title = 'About'; $this->params['breadcrumbs'][] = $this->title; $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,
meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the description of this page!'], 'description'); ?> <div class="site-about"> <h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<?php
echo DateTimePicker::widget([
'name' => 'dp_1',
'type' => DateTimePicker::TYPE_INPUT,
'value' => '23-Feb-1982 10:10',
'pluginOptions' => [
'autoclose'=>true,
'format' => 'dd-M-yyyy hh:ii'
]
]);
?>
</div>
Step 4 - ตอนนี้เรียกใช้เซิร์ฟเวอร์ php ในตัวจากรูทโปรเจ็กต์ผ่านไฟล์ php -S localhost:8080t web คำสั่ง
Step 5 - ไปที่ http://localhost:8080/index.php?r=site/about. คุณจะเห็นความเรียบร้อย datetime ตัวเลือกดังที่แสดงในภาพหน้าจอต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/datetime_picker.jpg)
ให้เราสร้างส่วนขยายง่ายๆที่แสดงมาตรฐาน “Hello world”ข้อความ. ส่วนขยายนี้จะเผยแพร่ผ่านที่เก็บ Packagist
Step 1 - สร้างโฟลเดอร์ชื่อ hello-worldในฮาร์ดไดรฟ์ของคุณ แต่ไม่อยู่ในเทมเพลตแอปพลิเคชันพื้นฐาน Yii) ภายในไดเร็กทอรี hello-world ให้สร้างไฟล์ชื่อcomposer.json ด้วยรหัสต่อไปนี้
{
"name": "tutorialspoint/hello-world",
"authors": [
{
"name": "tutorialspoint"
}
],
"require": {},
"autoload": {
"psr-0": {
"HelloWorld": "src/"
}
}
}
เราได้ประกาศว่าเราใช้มาตรฐาน PSR-0 และไฟล์นามสกุลทั้งหมดอยู่ภายใต้นามสกุล src โฟลเดอร์
Step 2 - สร้างเส้นทางไดเรกทอรีต่อไปนี้: hello-world/src/HelloWorld.
Step 3 - ภายใน HelloWorld สร้างไฟล์ชื่อ SayHello.php ด้วยรหัสต่อไปนี้
<?php
namespace HelloWorld;
class SayHello {
public static function world() {
return 'Hello World, Composer!';
}
}
?>
เราได้กำหนดไฟล์ SayHello คลาสด้วยฟังก์ชันคงที่ของโลกซึ่งส่งคืนไฟล์ hello ข้อความ.
Step 4- ส่วนขยายพร้อมแล้ว ตอนนี้สร้างที่เก็บว่างที่ไฟล์github และผลักดันส่วนขยายนี้ไปที่นั่น
ข้างใน hello-world เรียกใช้โฟลเดอร์ -
- เริ่มต้นคอมไพล์
- คอมไพล์เพิ่ม
- คอมมิต git -m "การกระทำเริ่มต้น"
- git จากระยะไกลเพิ่มต้นทาง <YOUR_NEWLY_CREATED_REPOSITORY>
- git push -u ต้นแบบต้นทาง
![](https://post.nghiatu.com/assets/tutorial/yii/images/push_extension.jpg)
เราเพิ่งส่งนามสกุลของเราไปยังไฟล์ github. ตอนนี้ไปที่https://packagist.org, ลงชื่อเข้าใช้และคลิก “submit” ที่เมนูด้านบน
คุณจะเห็นหน้าที่คุณควรป้อนที่เก็บ github ของคุณเพื่อเผยแพร่
![](https://post.nghiatu.com/assets/tutorial/yii/images/enter_github_repository.jpg)
Step 5 - คลิกไฟล์ “check” และส่วนขยายของคุณได้รับการเผยแพร่
![](https://post.nghiatu.com/assets/tutorial/yii/images/extension_publish.jpg)
Step 6- กลับไปที่เทมเพลตแอปพลิเคชันพื้นฐาน เพิ่มส่วนขยายลงในไฟล์composer.json.
{
"name": "yiisoft/yii2-app-basic",
"description": "Yii 2 Basic Project Template",
"keywords": ["yii2", "framework", "basic", "project template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "dev",
"prefer-stable" : true,
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.5",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"kartik-v/yii2-widget-datetimepicker": "*",
"tutorialspoint/hello-world": "*"
},
"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
"config": {
"process-timeout": 1800
},
"scripts": {
"post-create-project-cmd": [
"yii\\composer\\Installer::postCreateProject"
]
},
"extra": {
"yii\\composer\\Installer::postCreateProject": {
"setPermission": [
{
"runtime": "0777",
"web/assets": "0777",
"yii": "0755"
}
],
"generateCookieValidationKey": [
"config/web.php"
]
},
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}
Step 7 - ภายในโฟลเดอร์รูทของโปรเจ็กต์ให้เรียกใช้ไฟล์ composer update เพื่อติดตั้ง / อัปเดตการอ้างอิงทั้งหมด
![](https://post.nghiatu.com/assets/tutorial/yii/images/run_composer_update.jpg)
Step 8- ควรติดตั้งส่วนขยายของเรา หากต้องการใช้ให้แก้ไขไฟล์About มุมมองของ actionAbout วิธีการของ SiteController.
<?php
/* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views, meta, tags']); $this->registerMetaTag(['name' => 'description', 'content' => 'This is the
description of this page!'], 'description');
?>
<div class = "site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<h1><?= HelloWorld\SayHello::world(); ?></h1>
</div>
Step 9 - ประเภท http://localhost:8080/index.php?r=site/aboutในเว็บเบราว์เซอร์ คุณจะเห็นไฟล์hello world ข้อความจากส่วนขยายของเรา
![](https://post.nghiatu.com/assets/tutorial/yii/images/hello_world_message.jpg)
คำขอแสดงโดยไฟล์ yii\web\Request ซึ่งให้ข้อมูลเกี่ยวกับส่วนหัว HTTP พารามิเตอร์คำขอคุกกี้และอื่น ๆ
วิธีการ get() และ post() พารามิเตอร์การร้องขอคืนของคอมโพเนนต์คำขอ
Example -
$req = Yii::$app->request; /* * $get = $_GET; */ $get = $req->get(); /* * if(isset($_GET['id'])) {
* $id = $_GET['id'];
* } else {
* $id = null; * } */ $id = $req->get('id'); /* * if(isset($_GET['id'])) {
* $id = $_GET['id'];
* } else {
* $id = 1; * } */ $id = $req->get('id', 1); /* * $post = $_POST; */ $post = $req->post(); /* * if(isset($_POST['name'])) {
* $name = $_POST['name'];
* } else {
* $name = null; * } */ $name = $req->post('name'); /* * if(isset($_POST['name'])) {
* $name = $_POST['name'];
* } else {
* $name = ''; * } */ $name = $req->post('name', '');
Step 1 - เพิ่มไฟล์ actionTestGet ฟังก์ชันไปที่ SiteController ของเทมเพลตแอปพลิเคชันพื้นฐาน
public function actionTestGet() {
var_dump(Yii::$app->request->get());
}
Step 2 - ไปที่ http://localhost:8080/index.php?r=site/testget&id=1&name=tutorialspoint&message=welcomeคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/actiontestget_function_output.jpg)
ในการดึงพารามิเตอร์ของวิธีการร้องขออื่น ๆ (PATCH, DELETE ฯลฯ ) ให้ใช้ไฟล์ yii\web\Request::getBodyParam() วิธี.
หากต้องการรับเมธอด HTTP ของคำขอปัจจุบันให้ใช้ไฟล์ Yii::$app→request→method ทรัพย์สิน.
Step 3 - แก้ไขไฟล์ actionTestGet ดังแสดงในรหัสต่อไปนี้
public function actionTestGet() {
$req = Yii::$app->request; if ($req->isAjax) {
echo "the request is AJAX";
}
if ($req->isGet) { echo "the request is GET"; } if ($req->isPost) {
echo "the request is POST";
}
if ($req->isPut) {
echo "the request is PUT";
}
}
Step 4 - ไปที่ http://localhost:8080/index.php?r=site/test-get. คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/get_request.jpg)
คอมโพเนนต์คำขอมีคุณสมบัติมากมายเพื่อตรวจสอบ URL ที่ร้องขอ
Step 5 - แก้ไขไฟล์ actionTestGet ฟังก์ชันดังต่อไปนี้
public function actionTestGet() {
//the URL without the host
var_dump(Yii::$app->request->url);
//the whole URL including the host path
var_dump(Yii::$app->request->absoluteUrl); //the host of the URL var_dump(Yii::$app->request->hostInfo);
//the part after the entry script and before the question mark
var_dump(Yii::$app->request->pathInfo); //the part after the question mark var_dump(Yii::$app->request->queryString);
//the part after the host and before the entry script
var_dump(Yii::$app->request->baseUrl); //the URL without path info and query string var_dump(Yii::$app->request->scriptUrl);
//the host name in the URL
var_dump(Yii::$app->request->serverName); //the port used by the web server var_dump(Yii::$app->request->serverPort);
}
Step 6 - ในแถบที่อยู่ของเว็บเบราว์เซอร์ให้พิมพ์ http://localhost:8080/index.php?r=site/testget&id=1&name=tutorialspoint&message=welcomeคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/modify_actiontestget_function_output.jpg)
Step 7 - ในการรับข้อมูลส่วนหัว HTTP คุณสามารถใช้ไฟล์ yii\web\Request::$headersทรัพย์สิน. แก้ไขไฟล์actionTestGet ทำงานด้วยวิธีนี้
public function actionTestGet() {
var_dump(Yii::$app->request->headers);
}
Step 8 - หากคุณไปที่ URL http://localhost:8080/index.php?r=site/testget&id=1&name=tutorialspoint&message=welcomeคุณจะเห็นผลลัพธ์ดังแสดงในรหัสต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/modified_actiontestget_function_output.jpg)
ในการรับชื่อโฮสต์และที่อยู่ IP ของเครื่องไคลเอนต์ให้ใช้ userHost และ userIP คุณสมบัติ.
Step 9 - แก้ไขไฟล์ actionTestGet ทำงานด้วยวิธีนี้
public function actionTestGet() {
var_dump(Yii::$app->request->userHost); var_dump(Yii::$app->request->userIP);
}
Step 10 - ไปที่ที่อยู่ http://localhost:8080/index.php?r=site/test-get และคุณจะเห็นหน้าจอต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/actiontestget_function_output_screen.jpg)
เมื่อเว็บแอ็พพลิเคชันจัดการกับคำร้องขอจะสร้างอ็อบเจ็กต์การตอบสนองซึ่งประกอบด้วยส่วนหัว HTTP เนื้อหาและรหัสสถานะ HTTP ในกรณีส่วนใหญ่คุณจะใช้ส่วนประกอบแอปพลิเคชันการตอบกลับ โดยค่าเริ่มต้นจะเป็นอินสแตนซ์ของyii\web\Response.
ในการจัดการรหัสสถานะ HTTP การตอบกลับให้ใช้ไฟล์ yii\web\Response::$statusCodeทรัพย์สิน. ค่าเริ่มต้นของyii\web\Response::$statusCode คือ 200
Step 1 - เพิ่มฟังก์ชั่นชื่อ actionTestResponse ไปที่ SiteController.
public function actionTestResponse() {
Yii::$app→response->statusCode = 201;
}
Step 2 - หากคุณชี้เว็บเบราว์เซอร์ไปที่ http://localhost:8080/index.php?r=site/testresponseคุณควรสังเกตสถานะ HTTP การตอบกลับ 201 ที่สร้างขึ้น
![](https://post.nghiatu.com/assets/tutorial/yii/images/created_response_http_status.jpg)
หากคุณต้องการระบุว่าคำขอไม่สำเร็จคุณอาจโยนข้อยกเว้น HTTP ที่กำหนดไว้ล่วงหน้าอย่างใดอย่างหนึ่ง -
yii\web\BadRequestHttpException - รหัสสถานะ 400
yii\web\UnauthorizedHttpException - รหัสสถานะ 401
yii\web\ForbiddenHttpException - รหัสสถานะ 403
yii\web\NotFoundHttpException - รหัสสถานะ 404
yii\web\MethodNotAllowedHttpException - รหัสสถานะ 405
yii\web\NotAcceptableHttpException - รหัสสถานะ 406
yii\web\ConflictHttpException - รหัสสถานะ 409
yii\web\GoneHttpException - รหัสสถานะ 410
yii\web\UnsupportedMediaTypeHttpException - รหัสสถานะ 415
yii\web\TooManyRequestsHttpException - รหัสสถานะ 429
yii\web\ServerErrorHttpException - รหัสสถานะ 500
Step 3 - แก้ไขไฟล์ actionTestResponse ดังแสดงในรหัสต่อไปนี้
public function actionTestResponse() {
throw new \yii\web\GoneHttpException;
}
Step 4 - ประเภท http://localhost:8080/index.php?r=site/test-response ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นไฟล์ 410 Gone ตอบกลับสถานะ HTTP ดังแสดงในภาพต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/gone_response_http_status.jpg)
Step 5 - คุณสามารถส่งส่วนหัว HTTP โดยแก้ไขไฟล์ headersคุณสมบัติขององค์ประกอบการตอบสนอง หากต้องการเพิ่มส่วนหัวใหม่ในการตอบกลับให้แก้ไขไฟล์actionTestResponse ฟังก์ชันตามที่ระบุในรหัสต่อไปนี้
public function actionTestResponse() {
Yii::$app->response->headers->add('Pragma', 'no-cache');
}
Step 6 - ไปที่ http://localhost:8080/index.php?r=site/test-response, คุณจะเห็นส่วนหัว Pragma ของเรา
![](https://post.nghiatu.com/assets/tutorial/yii/images/pragma_header.jpg)
Yii รองรับรูปแบบการตอบสนองต่อไปนี้ -
HTML - ดำเนินการโดย yii \ web \ HtmlResponseFormatter
XML - ดำเนินการโดย yii \ web \ XmlResponseFormatter
JSON - ดำเนินการโดย yii \ web \ JsonResponseFormatter
JSONP - ดำเนินการโดย yii \ web \ JsonResponseFormatter
RAW - การตอบสนองโดยไม่มีการจัดรูปแบบใด ๆ
Step 7 - เพื่อตอบสนองในไฟล์ JSON แก้ไขรูปแบบ actionTestResponse ฟังก์ชัน
public function actionTestResponse() {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return [
'id' => '1',
'name' => 'Ivan',
'age' => 24,
'country' => 'Poland',
'city' => 'Warsaw'
];
}
Step 8 - ตอนนี้พิมพ์ http://localhost:8080/index.php?r=site/test-response ในแถบที่อยู่คุณจะเห็นสิ่งต่อไปนี้ JSON การตอบสนอง
![](https://post.nghiatu.com/assets/tutorial/yii/images/json_response.jpg)
Yii ดำเนินการเปลี่ยนเส้นทางเบราว์เซอร์โดยส่งส่วนหัวตำแหน่ง HTTP คุณสามารถโทรyii\web\Response::redirect() วิธีเปลี่ยนเส้นทางเบราว์เซอร์ของผู้ใช้ไปยัง URL
Step 9 - แก้ไขไฟล์ actionTestResponse ทำงานด้วยวิธีนี้
public function actionTestResponse() {
return $this->redirect('http://www.tutorialspoint.com/');
}
ตอนนี้ถ้าคุณไปที่ http://localhost:8080/index.php?r=site/test-response, เบราว์เซอร์ของคุณจะถูกเปลี่ยนเส้นทางไปที่ไฟล์ TutorialsPoint เว็บไซต์.
การส่งไฟล์
Yii มีวิธีการต่อไปนี้เพื่อรองรับการส่งไฟล์ -
yii\web\Response::sendFile() - ส่งไฟล์ที่มีอยู่
yii\web\Response::sendStreamAsFile() - ส่งสตรีมไฟล์ที่มีอยู่เป็นไฟล์
yii\web\Response::sendContentAsFile() - ส่งสตริงข้อความเป็นไฟล์
แก้ไขฟังก์ชัน actionTestResponse ด้วยวิธีนี้ -
public function actionTestResponse() {
return \Yii::$app->response->sendFile('favicon.ico');
}
ประเภท http://localhost:8080/index.php?r=site/test-responseคุณจะเห็นหน้าต่างโต้ตอบการดาวน์โหลดสำหรับไฟล์ favicon.ico ไฟล์ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/favicon_ico_file.jpg)
การตอบกลับจะไม่ถูกส่งจนกว่า yii\web\Response::send()เรียกว่าฟังก์ชัน โดยค่าเริ่มต้นเมธอดนี้เรียกว่าที่ส่วนท้ายของไฟล์yii\base\Application::run()วิธี. หากต้องการส่งคำตอบไฟล์yii\web\Response::send() วิธีทำตามขั้นตอนเหล่านี้ -
- ทริกเกอร์เหตุการณ์ yii \ web \ Response :: EVENT_BEFORE_SEND
- เรียกใช้เมธอด yii \ web \ Response :: เตรียม ()
- ทริกเกอร์เหตุการณ์ yii \ web \ Response :: EVENT_AFTER_PREPARE
- เรียกใช้เมธอด yii \ web \ Response :: sendHeaders ()
- เรียกใช้เมธอด yii \ web \ Response :: sendContent ()
- ทริกเกอร์เหตุการณ์ yii \ web \ Response :: EVENT_AFTER_SEND
เมื่อแอปพลิเคชัน Yii ประมวลผล URL ที่ร้องขอขั้นแรกจะแยกวิเคราะห์ URL เป็นเส้นทาง จากนั้นในการจัดการคำขอเส้นทางนี้จะใช้เพื่อสร้างอินสแตนซ์การดำเนินการของคอนโทรลเลอร์ที่เกี่ยวข้อง กระบวนการนี้เรียกว่าrouting. กระบวนการย้อนกลับเรียกว่าการสร้าง URL urlManagerส่วนประกอบของแอปพลิเคชันมีหน้าที่ในการกำหนดเส้นทางและการสร้าง URL มีสองวิธี -
parseRequest() - แยกวิเคราะห์คำขอเป็นเส้นทาง
createUrl() - สร้าง URL จากเส้นทางที่กำหนด
รูปแบบ URL
urlManager ส่วนประกอบแอปพลิเคชันรองรับ URL สองรูปแบบ -
รูปแบบเริ่มต้นใช้พารามิเตอร์เคียวรีrเพื่อแสดงเส้นทาง ตัวอย่างเช่น URL/index.php?r=news/view&id=5 แสดงถึงเส้นทาง news/view และ id พารามิเตอร์การสืบค้น 5.
รูปแบบ URL ที่สวยงามใช้เส้นทางพิเศษที่มีชื่อสคริปต์รายการ ตัวอย่างเช่นในตัวอย่างก่อนหน้ารูปแบบที่สวยงามจะเป็น/index.php/news/view/5. หากต้องการใช้รูปแบบนี้คุณต้องตั้งกฎ URL
ในการเปิดใช้งานรูปแบบ URL ที่สวยงามและซ่อนชื่อสคริปต์รายการให้ทำตามขั้นตอนเหล่านี้ -
Step 1 - แก้ไขไฟล์ config/web.php ไฟล์ด้วยวิธีต่อไปนี้
<?php
$params = require(__DIR__ . '/params.php');
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - //this is required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'urlManager' => [ 'showScriptName' => false, 'enablePrettyUrl' => true ], 'db' => require(__DIR__ . '/db.php'), ], 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
เราเพิ่งเปิดใช้งานไฟล์ pretty URL format และได้ปิดใช้งานชื่อสคริปต์รายการ
Step 2 - ตอนนี้ถ้าคุณพิมพ์ http://localhost:8080/site/about ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็น URL ที่สวยงามในการทำงาน
![](https://post.nghiatu.com/assets/tutorial/yii/images/pretty_url.jpg)
โปรดสังเกตว่า URL ไม่มีอีกแล้ว http://localhost:8080/index.php?r=site/about.
ในการเปลี่ยนเส้นทางเริ่มต้นของแอปพลิเคชันคุณควรกำหนดค่าไฟล์ defaultRoute ทรัพย์สิน.
Step 1 - แก้ไขไฟล์ config/web.php ไฟล์ด้วยวิธีต่อไปนี้
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'defaultRoute' => 'site/contact',
'components' => [
//other code
?>
Step 2 - ไปถึงแล้ว http://localhost:8080/index.php. คุณจะเห็นค่าเริ่มต้นcontact หน้า.
![](https://post.nghiatu.com/assets/tutorial/yii/images/contact_page.jpg)
ในการทำให้แอปพลิเคชันของคุณอยู่ในโหมดการบำรุงรักษาชั่วคราวคุณควรกำหนดค่าไฟล์ yii\web\Application::$catchAll ทรัพย์สิน.
Step 3 - เพิ่มฟังก์ชันต่อไปนี้ในไฟล์ SiteController.
public function actionMaintenance() {
echo "<h1>Maintenance</h1>";
}
Step 4 - จากนั้นแก้ไขไฟล์ config/web.php ไฟล์ด้วยวิธีต่อไปนี้
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'catchAll' => ['site/maintenance'],
'components' => [
//OTHER CODE
Step 5 - ตอนนี้ป้อน URL ของแอปพลิเคชันของคุณคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/maintenance.jpg)
การสร้าง URL
ในการสร้าง URL ประเภทต่างๆคุณสามารถใช้ไฟล์ yii\helpers\Url::to()วิธีการช่วยเหลือ ตัวอย่างต่อไปนี้ถือว่ามีการใช้รูปแบบ URL เริ่มต้น
Step 1 - เพิ่มไฟล์ actionRoutes() วิธีการ SiteController.
public function actionRoutes() {
return $this->render('routes');
}
วิธีนี้เพียงแค่แสดงผลไฟล์ routes ดู.
Step 2 - ภายในไดเร็กทอรี views / site ให้สร้างไฟล์ชื่อ routes.php ด้วยรหัสต่อไปนี้
<?php
use yii\helpers\Url;
?>
<h4>
<b>Url::to(['post/index']):</b>
<?php
// creates a URL to a route: /index.php?r = post/index
echo Url::to(['post/index']);
?>
</h4>
<h4>
<b>Url::to(['post/view', 'id' => 100]):</b>
<?php
// creates a URL to a route with parameters: /index.php?r = post/view&id=100
echo Url::to(['post/view', 'id' => 100]);
?>
</h4>
<h4>
<b>Url::to(['post/view', 'id' => 100, '#' => 'content']):</b>
<?php
// creates an anchored URL: /index.php?r = post/view&id=100#content
echo Url::to(['post/view', 'id' => 100, '#' => 'content']);
?>
</h4>
<h4>
<b>Url::to(['post/index'], true):</b>
<?php
// creates an absolute URL: http://www.example.com/index.php?r=post/index
echo Url::to(['post/index'], true);
?>
</h4>
<h4>
<b>Url::to(['post/index'], 'https'):</b>
<?php
// creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post/index
echo Url::to(['post/index'], 'https');
?>
</h4>
Step 3 - ประเภท http://localhost:8080/index.php?r=site/routesคุณจะเห็นการใช้งานไฟล์ to() ฟังก์ชัน
![](https://post.nghiatu.com/assets/tutorial/yii/images/to_funtion.jpg)
เส้นทางผ่านไปยัง yii\helpers\Url::to() วิธีการอาจเป็นญาติหรือสัมบูรณ์ตามกฎต่อไปนี้ -
หากเส้นทางว่างระบบจะใช้เส้นทางที่ร้องขอในปัจจุบัน
หากเส้นทางไม่มีเครื่องหมายทับนำหน้าจะถือว่าเป็นเส้นทางที่สัมพันธ์กับโมดูลปัจจุบัน
หากเส้นทางไม่มีเครื่องหมายทับจะถือว่าเป็นรหัสการดำเนินการของตัวควบคุมปัจจุบัน
yii\helpers\Url คลาสผู้ช่วยยังมีวิธีการที่มีประโยชน์มากมาย
Step 4 - แก้ไขไฟล์ routes ดูตามที่ระบุในรหัสต่อไปนี้
<?php
use yii\helpers\Url;
?>
<h4>
<b>Url::home():</b>
<?php
// home page URL: /index.php?r=site/index
echo Url::home();
?>
</h4>
<h4>
<b>Url::base():</b>
<?php
// the base URL, useful if the application is deployed in a sub-folder of the Web root
echo Url::base();
?>
</h4>
<h4>
<b>Url::canonical():</b>
<?php
// the canonical URL of the currently requested URL
// see https://en.wikipedia.org/wiki/Canonical_link_element
echo Url::canonical();
?>
</h4>
<h4>
<b>Url::previous():</b>
<?php
// remember the currently requested URL and retrieve it back in later requests
Url::remember();
echo Url::previous();
?>
</h4>
Step 5 - หากคุณกรอกที่อยู่ http://localhost:8080/index.php?r=site/routes ในเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/modified_routes_view_output.jpg)
กฎ URL เป็นตัวอย่าง if yii\web\UrlRule. urlManager คอมโพเนนต์ใช้กฎ URL ที่ประกาศไว้ในไฟล์ rules คุณสมบัติเมื่อเปิดใช้งานรูปแบบ URL ที่สวยงาม
ในการแยกวิเคราะห์คำขอตัวจัดการ URL จะได้รับกฎตามลำดับที่ประกาศและมองหากฎข้อแรก
Step 1 - แก้ไขไฟล์ urlManager ส่วนประกอบใน config/web.php ไฟล์.
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true,
'rules' => [
'about' => 'site/about',
]
],
Step 2 - ไปที่เว็บเบราว์เซอร์ของคุณที่ http://localhost:8080/about, คุณจะเห็นหน้าเกี่ยวกับ
![](https://post.nghiatu.com/assets/tutorial/yii/images/modified_urlmanager_component.jpg)
กฎ URL สามารถเชื่อมโยงกับพารามิเตอร์การค้นหาในรูปแบบนี้ -
<ParamName: RegExp> โดยที่ -
ParamName - ชื่อพารามิเตอร์
RegExp - นิพจน์ทั่วไปที่เป็นทางเลือกที่ใช้เพื่อจับคู่ค่าพารามิเตอร์
สมมติว่าเราได้ประกาศกฎ URL ต่อไปนี้ -
[
'articles/<year:\d{4}>/<category>' => 'article/index',
'articles' => 'article/index',
'article/<id:\d+>' => 'article/view',
]
เมื่อกฎถูกใช้สำหรับ parsing -
- /index.php/articles แยกวิเคราะห์เป็นบทความ / ดัชนี
- /index.php/articles/2014/php จะแยกวิเคราะห์ลงในบทความ / ดัชนี
- /index.php/article/100 แยกวิเคราะห์เป็นบทความ / มุมมอง
- /index.php/articles/php แยกวิเคราะห์เป็นบทความ / php
เมื่อกฎถูกใช้สำหรับ creating URLs -
Url :: to (['article / index']) สร้าง /index.php/articles
Url :: to (['article / index', 'year' => 2014, 'category' => 'php']) สร้าง /index.php/articles/2014/php
Url :: to (['article / view', 'id' => 100]) สร้าง /index.php/article/100
Url :: to (['article / view', 'id' => 100, 'source' => 'ad']) สร้าง /index.php/article/100?source=ad
URL :: to (['article / index', 'category' => 'php']) สร้าง /index.php/article/index?category=php
ในการเพิ่มคำต่อท้ายให้กับ URL คุณควรกำหนดค่าไฟล์ yii\web\UrlManager::$suffix ทรัพย์สิน.
Step 3 - แก้ไขไฟล์ urlComponent ใน config/web.php ไฟล์.
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'suffix' => '.html'
],
Step 4 - พิมพ์ที่อยู่ http://localhost:8080/site/contact.htmlในแถบที่อยู่ของเว็บเบราว์เซอร์และคุณจะเห็นสิ่งต่อไปนี้บนหน้าจอของคุณ สังเกตhtml คำต่อท้าย.
![](https://post.nghiatu.com/assets/tutorial/yii/images/notice_html_suffix.jpg)
เมื่อฟอร์มขึ้นอยู่กับแบบจำลองวิธีทั่วไปในการสร้างแบบฟอร์มนี้ใน Yii คือผ่านทาง yii\widgets\ActiveFormชั้นเรียน. ในกรณีส่วนใหญ่ฟอร์มจะมีแบบจำลองที่เกี่ยวข้องซึ่งใช้สำหรับการตรวจสอบข้อมูล หากโมเดลแสดงข้อมูลจากฐานข้อมูลโมเดลควรได้มาจากไฟล์ActiveRecordชั้นเรียน. หากโมเดลจับอินพุตโดยพลการควรได้มาจากไฟล์yii\base\Model ชั้นเรียน.
ให้เราสร้างแบบฟอร์มการลงทะเบียน
Step 1 - ภายใน models สร้างไฟล์ชื่อ RegistrationForm.php ด้วยรหัสต่อไปนี้
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username; public $password;
public $email; public $subscriptions;
public $photos;
/**
* @return array customized attribute labels
*/
public function attributeLabels() {
return [
'username' => 'Username',
'password' => 'Password',
'email' => 'Email',
'subscriptions' => 'Subscriptions',
'photos' => 'Photos',
];
}
}
?>
เราได้ประกาศรูปแบบสำหรับแบบฟอร์มการลงทะเบียนของเราโดยมีคุณสมบัติห้าประการ ได้แก่ ชื่อผู้ใช้รหัสผ่านอีเมลการสมัครสมาชิกและรูปถ่าย
Step 2 - หากต้องการแสดงแบบฟอร์มนี้ให้เพิ่มไฟล์ actionRegistration วิธีการ SiteController.
public function actionRegistration() {
$mRegistration = new RegistrationForm();
return $this->render('registration', ['model' => $mRegistration]);
}
เราสร้างอินสแตนซ์ของไฟล์ RegistrationFormและส่งไปยังมุมมองการลงทะเบียน ตอนนี้ได้เวลาสร้างมุมมอง
Step 3 - ภายในโฟลเดอร์ views / site ให้เพิ่มไฟล์ชื่อ registration.php ด้วยรหัสต่อไปนี้
<?php
use yii\bootstrap\ActiveForm;
use yii\bootstrap\Html;
?>
<div class = "row">
<div class = "col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'registration-form']); ?> <?= $form->field($model, 'username') ?> <?= $form->field($model, 'password')->passwordInput() ?> <?= $form->field($model, 'email')->input('email') ?> <?= $form->field($model, 'photos[]')->fileInput(['multiple'=>'multiple']) ?> <?= $form->field($model, 'subscriptions[]')->checkboxList(['a' => 'Item A',
'b' => 'Item B', 'c' => 'Item C']) ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'registration-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
เราสังเกตสิ่งต่อไปนี้ -
ActiveForm::begin()ฟังก์ชันทำเครื่องหมายจุดเริ่มต้นของแบบฟอร์ม รหัสทั้งหมดระหว่างActiveForm::begin() และ ActiveForm::end() ฟังก์ชันจะถูกรวมไว้ในไฟล์ form แท็ก
ในการสร้างฟิลด์ในรูปแบบคุณควรเรียกไฟล์ ActiveForm::field()วิธี. มันสร้างไฟล์input and labelแท็ก ชื่ออินพุตจะถูกกำหนดโดยอัตโนมัติ
ตัวอย่างเช่นไฟล์ password แอตทริบิวต์จะเป็น RegistrationForm[password]. หากคุณต้องการให้แอตทริบิวต์รับอาร์เรย์คุณควรเพิ่ม [] ต่อท้ายชื่อแอตทริบิวต์
Step 4 - หากคุณไปที่แถบที่อยู่ของเว็บเบราว์เซอร์แล้วพิมพ์ http://localhost:8080/index.php?r=site/registrationคุณจะเห็นแบบฟอร์มของเรา
![](https://post.nghiatu.com/assets/tutorial/yii/images/registration.jpg)
คุณไม่ควรเชื่อถือข้อมูลที่ได้รับจากผู้ใช้ ในการตรวจสอบโมเดลด้วยอินพุตของผู้ใช้คุณควรโทรyii\base\Model::validate()วิธี. จะส่งคืนค่าบูลีนหากการตรวจสอบความถูกต้องสำเร็จ หากมีข้อผิดพลาดคุณอาจได้รับจากไฟล์yii\base\Model::$errors ทรัพย์สิน.
การใช้กฎ
เพื่อให้ validate() ฟังก์ชันทำงานคุณควรแทนที่ไฟล์ yii\base\Model::rules() วิธี.
Step 1 - rules() วิธีการส่งคืนอาร์เรย์ในรูปแบบต่อไปนี้
[
// required, specifies which attributes should be validated
['attr1', 'attr2', ...],
// required, specifies the type a rule.
'type_of_rule',
// optional, defines in which scenario(s) this rule should be applied
'on' => ['scenario1', 'scenario2', ...],
// optional, defines additional configurations
'property' => 'value', ...
]
สำหรับแต่ละกฎคุณควรกำหนดแอตทริบิวต์ที่ใช้กับกฎเป็นอย่างน้อยและประเภทของกฎที่ใช้
กฎการตรวจสอบหลักคือ - boolean, captcha, compare, date, default, double, each, email, exist, file, filter, image, ip, in, integer, match, number, required, safe, string, trim, unique, url.
Step 2 - สร้างโมเดลใหม่ในไฟล์ models โฟลเดอร์
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username; public $password;
public $email; public $country;
public $city; public $phone;
public function rules() {
return [
// the username, password, email, country, city, and phone attributes are
//required
[['username' ,'password', 'email', 'country', 'city', 'phone'], 'required'],
// the email attribute should be a valid email address
['email', 'email'],
];
}
}
?>
เราได้ประกาศรุ่นสำหรับแบบฟอร์มลงทะเบียนแล้ว โมเดลนี้มีคุณสมบัติห้าประการ ได้แก่ ชื่อผู้ใช้รหัสผ่านอีเมลประเทศเมืองและโทรศัพท์ จำเป็นต้องใช้ทั้งหมดและคุณสมบัติอีเมลต้องเป็นที่อยู่อีเมลที่ถูกต้อง
Step 3 - เพิ่มไฟล์ actionRegistration วิธีการ SiteController ที่เราสร้างไฟล์ RegistrationForm จำลองและส่งต่อไปยังมุมมอง
public function actionRegistration() {
$model = new RegistrationForm(); return $this->render('registration', ['model' => $model]);
}
Step 4- เพิ่มมุมมองสำหรับแบบฟอร์มการลงทะเบียนของเรา ภายในโฟลเดอร์ views / site ให้สร้างไฟล์ชื่อ register.php ด้วยรหัสต่อไปนี้
<?php
use yii\bootstrap\ActiveForm;
use yii\bootstrap\Html;
?>
<div class = "row">
<div class = "col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'registration-form']); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'email')->input('email') ?>
<?= $form->field($model, 'country') ?>
<?= $form->field($model, 'city') ?>
<?= $form->field($model, 'phone') ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'registration-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
เรากำลังใช้ไฟล์ ActiveForm วิดเจ็ตสำหรับแสดงแบบฟอร์มการลงทะเบียนของเรา
Step 5 - หากคุณไปที่โฮสต์ในพื้นที่ http://localhost:8080/index.php?r=site/registration และคลิกปุ่มส่งคุณจะเห็นกฎการตรวจสอบความถูกต้องในการดำเนินการ
![](https://post.nghiatu.com/assets/tutorial/yii/images/validation_rules.jpg)
Step 6 - ในการปรับแต่งข้อความแสดงข้อผิดพลาดสำหรับไฟล์ username คุณสมบัติแก้ไขไฟล์ rules() วิธีการของ RegistrationForm ด้วยวิธีต่อไปนี้
public function rules() {
return [
// the username, password, email, country, city, and phone attributes are required
[['password', 'email', 'country', 'city', 'phone'], 'required'],
['username', 'required', 'message' => 'Username is required'],
// the email attribute should be a valid email address
['email', 'email'],
];
}
Step 7 - ไปที่โฮสต์ในพื้นที่ http://localhost:8080/index.php?r=site/registrationแล้วคลิกปุ่มส่ง คุณจะสังเกตเห็นว่าข้อความแสดงข้อผิดพลาดของคุณสมบัติชื่อผู้ใช้มีการเปลี่ยนแปลง
![](https://post.nghiatu.com/assets/tutorial/yii/images/change_username_property.jpg)
Step 8 - ในการปรับแต่งกระบวนการตรวจสอบคุณสามารถแทนที่วิธีการเหล่านี้ได้
yii \ base \ Model :: beforeValidate (): ทริกเกอร์ a
yii \ base \ Model :: เหตุการณ์ EVENT_BEFORE_VALIDATE
yii \ base \ Model :: afterValidate (): ทริกเกอร์ a
yii \ base \ Model :: เหตุการณ์ EVENT_AFTER_VALIDATE
Step 9 - ในการตัดแต่งช่องว่างรอบ ๆ ทรัพย์สินของประเทศและเปลี่ยนอินพุตที่ว่างเปล่าของคุณสมบัติของเมืองให้เป็นค่าว่างคุณสามารถ trim และ default ผู้ตรวจสอบความถูกต้อง
public function rules() {
return [
// the username, password, email, country, city, and phone attributes are required
[['password', 'email', 'country', 'city', 'phone'], 'required'],
['username', 'required', 'message' => 'Username is required'],
['country', 'trim'], ['city', 'default'],
// the email attribute should be a valid email address
['email', 'email'],
];
}
Step 10 - หากอินพุตว่างคุณสามารถตั้งค่าเริ่มต้นได้
public function rules() {
return [
['city', 'default', 'value' => 'Paris'],
];
}
หากคุณสมบัติของเมืองว่างเปล่าระบบจะใช้ค่า "ปารีส" เริ่มต้น
บางครั้งคุณต้องตรวจสอบความถูกต้องของค่าที่ไม่ผูกมัดกับโมเดลใด ๆ คุณสามารถใช้ไฟล์yii\base\DynamicModel คลาสซึ่งรองรับการกำหนดคุณสมบัติและกฎได้ทันที
Step 1 - เพิ่มไฟล์ actionAdHocValidation วิธีการ SiteController.
public function actionAdHocValidation() {
$model = DynamicModel::validateData([ 'username' => 'John', 'email' => '[email protected]' ], [ [['username', 'email'], 'string', 'max' => 12], ['email', 'email'], ]); if ($model->hasErrors()) {
var_dump($model->errors);
} else {
echo "success";
}
}
ในโค้ดด้านบนเรากำหนด a “dynamic” แบบจำลองด้วยชื่อผู้ใช้และคุณสมบัติอีเมลและตรวจสอบความถูกต้อง
Step 2 - ประเภท http://localhost:8080/index.php?r=site/ad-hoc-validation ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นข้อความแสดงข้อผิดพลาดเนื่องจากอีเมลของเรามีความยาว 14 อักขระ
![](https://post.nghiatu.com/assets/tutorial/yii/images/fourteen_characters_long.jpg)
Custom Validators
ตัวตรวจสอบความถูกต้องที่กำหนดเองมีสองประเภท -
- ตัวตรวจสอบแบบอินไลน์
- ตัวตรวจสอบแบบสแตนด์อโลน
ตัวตรวจสอบความถูกต้องแบบอินไลน์ถูกกำหนดโดยวิธีแบบจำลองหรือฟังก์ชันที่ไม่ระบุชื่อ หากแอตทริบิวต์ไม่ผ่านการตรวจสอบความถูกต้องคุณควรเรียกไฟล์yii\base\Model::addError() วิธีบันทึกข้อความแสดงข้อผิดพลาด
ตัวอย่างต่อไปนี้ของไฟล์ RegistrationForm ตรวจสอบความถูกต้องของสถานที่ให้บริการในเมืองดังนั้นจึงสามารถรับค่าได้สองค่าเท่านั้น - ลอนดอนและปารีส
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username;
public $password; public $email;
public $country; public $city;
public $phone; public function rules() { return [ ['city', 'validateCity'] ]; } public function validateCity($attribute, $params) { if (!in_array($this->$attribute, ['Paris', 'London'])) { $this->addError($attribute, 'The city must be either "London" or "Paris".');
}
}
}
?>
โปรแกรมตรวจสอบแบบสแตนด์อโลนขยายไฟล์ yii\validators\Validatorชั้นเรียน. ในการใช้ตรรกะการตรวจสอบความถูกต้องคุณควรแทนที่ไฟล์yii\validators\Validator::validateAttribute() วิธี.
Step 1 - หากต้องการใช้ตัวอย่างก่อนหน้านี้โดยใช้โปรแกรมตรวจสอบความถูกต้องแบบสแตนด์อโลนให้เพิ่มไฟล์ CityValidator.php ไฟล์ไปยังไฟล์ components โฟลเดอร์
<?php
namespace app\components;
use yii\validators\Validator;
class CityValidator extends Validator {
public function validateAttribute($model, $attribute) { if (!in_array($model->$attribute, ['Paris', 'London'])) { $this->addError($model, $attribute, 'The city must be either "Paris"
or "London".');
}
}
}
?>
Step 2 - จากนั้นแก้ไขไฟล์ RegistrationForm โมเดลด้วยวิธีนี้
<?php
namespace app\models;
use app\components\CityValidator;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username; public $password;
public $email; public $country;
public $city; public $phone;
public function rules() {
return [
['city', CityValidator::className()]
];
}
}
?>
การตรวจสอบชื่อผู้ใช้ควรทำในฝั่งเซิร์ฟเวอร์เท่านั้นเนื่องจากเซิร์ฟเวอร์เท่านั้นที่มีข้อมูลที่จำเป็น ในกรณีนี้คุณสามารถใช้การตรวจสอบความถูกต้องโดยใช้ AJAX
Step 1 - หากต้องการเปิดใช้งานการตรวจสอบความถูกต้อง AJAX ให้แก้ไขไฟล์ registration ดูทางนี้
<?php
use yii\bootstrap\ActiveForm;
use yii\bootstrap\Html;
?>
<div class = "row">
<div class = "col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'registration-form', 'enableAjaxValidation' => true]); ?>
<?= $form->field($model, 'username') ?> <?= $form->field($model, 'password')->passwordInput() ?> <?= $form->field($model, 'email')->input('email') ?> <?= $form->field($model, 'country') ?> <?= $form->field($model, 'city') ?> <?= $form->field($model, 'phone') ?>
<div class = "form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'registration-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
เราควรเตรียมเซิร์ฟเวอร์เพื่อให้สามารถจัดการกับคำขอ AJAX ได้
Step 2 - แก้ไขไฟล์ actionRegistration วิธีการของ SiteController ทางนี้.
public function actionRegistration() {
$model = new RegistrationForm();
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request>post())) { Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model); } return $this->render('registration', ['model' => $model]);
}
Step 3 - ไปที่ http://localhost:8080/index.php?r=site/registrationคุณจะสังเกตเห็นว่าการตรวจสอบแบบฟอร์มดำเนินการโดยคำขอของ AJAX
![](https://post.nghiatu.com/assets/tutorial/yii/images/ajax_requests.jpg)
เซสชันทำให้ข้อมูลสามารถเข้าถึงได้ในหน้าต่างๆ เซสชันสร้างไฟล์บนเซิร์ฟเวอร์ในไดเร็กทอรีชั่วคราวที่เก็บตัวแปรเซสชันทั้งหมด ข้อมูลนี้มีอยู่ในทุกหน้าของเว็บไซต์ของคุณในระหว่างการเยี่ยมชมของผู้ใช้รายนั้น
เมื่อเซสชันเริ่มต้นสิ่งต่อไปนี้จะเกิดขึ้น -
PHP สร้าง ID เฉพาะสำหรับเซสชันนั้น ๆ
คุกกี้ที่เรียกว่า PHPSESSID จะถูกส่งไปยังฝั่งไคลเอ็นต์ (ไปยังเบราว์เซอร์)
เซิร์ฟเวอร์สร้างไฟล์ในโฟลเดอร์ชั่วคราวที่บันทึกตัวแปรเซสชันทั้งหมด
เมื่อเซิร์ฟเวอร์ต้องการดึงค่าจากตัวแปรเซสชัน PHP จะรับรหัสเซสชันเฉพาะจากคุกกี้ PHPSESSID โดยอัตโนมัติ จากนั้นจะค้นหาไฟล์ที่ต้องการในไดเร็กทอรีชั่วคราว
ในการเริ่มเซสชันคุณควรโทรไปที่ไฟล์ session_start()ฟังก์ชัน ตัวแปรเซสชันทั้งหมดจะถูกเก็บไว้ในไฟล์$_SESSIONตัวแปรส่วนกลาง คุณยังสามารถใช้ไฟล์isset() เพื่อตรวจสอบว่าตัวแปรเซสชันถูกตั้งค่าไว้หรือไม่ -
<?php
session_start();
if( isset( $_SESSION['number'] ) ) { $_SESSION['number'] += 1;
}else {
$_SESSION['number'] = 1; } $msg = "This page was visited ". $_SESSION['number']; $msg .= "in this session.";
echo $msg;
?>
หากต้องการทำลายเซสชันคุณควรเรียกไฟล์ session_destroy()ฟังก์ชัน หากต้องการทำลายตัวแปรเซสชันเดียวให้เรียกไฟล์unset() ฟังก์ชัน -
<?php
unset($_SESSION['number']);
session_destroy();
?>
การใช้เซสชันใน Yii
เซสชันช่วยให้ข้อมูลคงอยู่ในคำขอของผู้ใช้ ใน PHP คุณสามารถเข้าถึงได้ผ่านไฟล์$_SESSIONตัวแปร. ใน Yii คุณสามารถเข้าถึงเซสชันผ่านส่วนประกอบแอปพลิเคชันเซสชัน
Step 1 - เพิ่มไฟล์ actionOpenAndCloseSession วิธีการ SiteController.
public function actionOpenAndCloseSession() {
$session = Yii::$app->session; // open a session $session->open();
// check if a session is already opened
if ($session->isActive) echo "session is active"; // close a session $session->close();
// destroys all data registered to a session
$session->destroy();
}
ในโค้ดด้านบนเราได้รับส่วนประกอบของแอปพลิเคชันเซสชันเปิดเซสชันตรวจสอบว่ามีการใช้งานอยู่หรือไม่ปิดเซสชันและในที่สุดก็ทำลายมัน
Step 2 - ประเภท http://localhost:8080/index.php?r=site/open-and-close-session ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/session_active.jpg)
ในการเข้าถึงตัวแปรเซสชันคุณสามารถใช้ set() และ get() วิธีการ
Step 3 - เพิ่มไฟล์ actionAccessSession วิธีการ SiteController.
public function actionAccessSession() {
$session = Yii::$app->session; // set a session variable $session->set('language', 'ru-RU');
// get a session variable
$language = $session->get('language');
var_dump($language); // remove a session variable $session->remove('language');
// check if a session variable exists
if (!$session->has('language')) echo "language is not set"; $session['captcha'] = [
'value' => 'aSBS23',
'lifetime' => 7200,
];
var_dump($session['captcha']);
}
Step 4 - ไปที่ http://localhost:8080/index.php?r=site/access-sessionคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/access_session.jpg)
Yii ให้แนวคิดเกี่ยวกับข้อมูลแฟลช ข้อมูล Flash เป็นข้อมูลเซสชันซึ่ง -
- ถูกตั้งค่าในคำขอเดียว
- จะมีให้ในคำขอถัดไปเท่านั้น
- จะถูกลบโดยอัตโนมัติในภายหลัง
Step 1 - เพิ่มไฟล์ actionShowFlash วิธีการ SiteController.
public function actionShowFlash() {
$session = Yii::$app->session; // set a flash message named as "greeting" $session->setFlash('greeting', 'Hello user!');
return $this->render('showflash');
}
Step 2 - ภายในโฟลเดอร์ views / site ให้สร้างไฟล์ View ที่เรียกว่า showflash.php.
<?php
use yii\bootstrap\Alert;
echo Alert::widget([
'options' => ['class' => 'alert-info'],
'body' => Yii::$app->session->getFlash('greeting'),
]);
?>
Step 3 - เมื่อคุณพิมพ์ http://localhost:8080/index.php?r=site/show-flash ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/showflash_php_file.jpg)
Yii ยังมีคลาสเซสชั่นต่อไปนี้ -
yii\web\CacheSession - เก็บข้อมูลเซสชั่นในแคช
yii\web\DbSession - จัดเก็บข้อมูลเซสชั่นในฐานข้อมูล
yii\mongodb\Session - เก็บข้อมูลเซสชั่นใน MongoDB
yii\redis\Session - เก็บข้อมูลเซสชั่นโดยใช้ฐานข้อมูล redis
คุกกี้คือไฟล์ข้อความธรรมดาที่จัดเก็บบนฝั่งไคลเอ็นต์ คุณสามารถใช้เพื่อวัตถุประสงค์ในการติดตาม
มีสามขั้นตอนในการระบุผู้ใช้ที่กลับมา -
เซิร์ฟเวอร์ส่งชุดคุกกี้ไปยังไคลเอนต์ (เบราว์เซอร์) ตัวอย่างเช่น id หรือ token
เบราว์เซอร์เก็บมัน
ครั้งต่อไปที่เบราว์เซอร์ส่งคำขอไปยังเว็บเซิร์ฟเวอร์มันจะส่งคุกกี้เหล่านั้นด้วยเพื่อให้เซิร์ฟเวอร์สามารถใช้ข้อมูลนั้นเพื่อระบุตัวผู้ใช้
โดยปกติคุกกี้จะถูกตั้งค่าในส่วนหัว HTTP ดังที่แสดงในรหัสต่อไปนี้
HTTP/1.1 200 OK
Date: Fri, 05 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = myname; expires = Monday, 06-Feb-16 22:03:38 GMT;
path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html
PHP ให้ไฟล์ setcookie() ฟังก์ชั่นการตั้งค่าคุกกี้ -
setcookie(name, value, expire, path, domain, security);
ที่ไหน -
name - ตั้งชื่อคุกกี้และเก็บไว้ในตัวแปรสภาพแวดล้อมที่เรียกว่า HTTP_COOKIE_VARS
value - ตั้งค่าของตัวแปรที่ตั้งชื่อ
expiry - ระบุเวลาในอนาคตเป็นวินาทีตั้งแต่ 00:00:00 GMT ของวันที่ 1 มกราคม 1970 หลังจากเวลานี้คุกกี้จะไม่สามารถเข้าถึงได้
path - ระบุไดเร็กทอรีที่คุกกี้ถูกต้อง
domain- สามารถใช้เพื่อกำหนดชื่อโดเมนในโดเมนที่มีขนาดใหญ่มาก คุกกี้ทั้งหมดใช้ได้เฉพาะกับโฮสต์และโดเมนที่สร้างขึ้น
security - หากตั้งค่าเป็นหมายความว่าควรส่งคุกกี้โดย HTTPS เท่านั้นมิฉะนั้นเมื่อตั้งค่าเป็น 0 คุกกี้สามารถส่งผ่าน HTTP ปกติได้
ในการเข้าถึงคุกกี้ใน PHP คุณสามารถใช้ไฟล์ $_COOKIE or $HTTP_COOKIE_VARS ตัวแปร
<?php
echo $_COOKIE["token"]. "<br />"; /* is equivalent to */ echo $HTTP_COOKIE_VARS["token"]. "<br />";
echo $_COOKIE["id"] . "<br />"; /* is equivalent to */ echo $HTTP_COOKIE_VARS["id"] . "<br />";
?>
หากต้องการลบคุกกี้คุณควรตั้งค่าคุกกี้ด้วยวันที่ที่หมดอายุแล้ว
<?php
setcookie( "token", "", time()- 60, "/","", 0);
setcookie( "id", "", time()- 60, "/","", 0);
?>
คุกกี้อนุญาตให้เก็บข้อมูลไว้ในคำขอต่างๆ ใน PHP คุณสามารถเข้าถึงได้ผ่านไฟล์$_COOKIEตัวแปร. Yii แสดงถึงคุกกี้เป็นวัตถุของไฟล์yii\web\Cookieชั้นเรียน. ในบทนี้เราจะอธิบายวิธีการอ่านคุกกี้ต่างๆ
Step 1 - สร้างไฟล์ actionReadCookies วิธีการใน SiteController.
public function actionReadCookies() {
// get cookies from the "request" component
$cookies = Yii::$app->request->cookies; // get the "language" cookie value // if the cookie does not exist, return "ru" as the default value $language = $cookies->getValue('language', 'ru'); // an alternative way of getting the "language" cookie value if (($cookie = $cookies->get('language')) !== null) { $language = $cookie->value; } // you may also use $cookies like an array
if (isset($cookies['language'])) { $language = $cookies['language']->value; } // check if there is a "language" cookie if ($cookies->has('language')) echo "Current language: $language";
}
Step 2 - หากต้องการดูการส่งคุกกี้ให้สร้างเมธอดที่เรียกว่า actionSendCookies ใน SiteController.
public function actionSendCookies() {
// get cookies from the "response" component
$cookies = Yii::$app->response->cookies; // add a new cookie to the response to be sent $cookies->add(new \yii\web\Cookie([
'name' => 'language',
'value' => 'ru-RU',
]));
$cookies->add(new \yii\web\Cookie([ 'name' => 'username', 'value' => 'John', ])); $cookies->add(new \yii\web\Cookie([
'name' => 'country',
'value' => 'USA',
]));
}
Step 3 - ทีนี้ถ้าคุณไปที่ http://localhost:8080/index.php?r=site/send-cookiesคุณจะสังเกตเห็นว่าคุกกี้ถูกบันทึกไว้ในเบราว์เซอร์
![](https://post.nghiatu.com/assets/tutorial/yii/images/save_cookies.jpg)
ใน Yii โดยค่าเริ่มต้นจะเปิดใช้งานการตรวจสอบคุกกี้ ปกป้องคุกกี้จากการถูกแก้ไขในฝั่งไคลเอ็นต์ สตริงแฮชจากไฟล์ config / web.php เซ็นชื่อคุกกี้แต่ละรายการ
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [ // !!! insert a secret key in the following (if it is empty) - this is //required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
//'showScriptName' => false,
//'enablePrettyUrl' => true,
//'enableStrictParsing' => true,
//'suffix' => '/'
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
?>
คุณสามารถปิดใช้งานการตรวจสอบคุกกี้ได้โดยตั้งค่าไฟล์ yii\web\Request::$enableCookieValidation คุณสมบัติถึง false.
คุณสามารถใช้งานฟังก์ชั่นการอัพโหลดไฟล์ได้อย่างง่ายดายด้วยความช่วยเหลือของ yii\web\UploadedFile, models และ yii\widgets\ActiveForm.
สร้างไดเร็กทอรี ‘uploads’ในโฟลเดอร์รูท ไดเรกทอรีนี้จะเก็บภาพที่อัปโหลดทั้งหมด ในการอัปโหลดไฟล์เดียวคุณต้องสร้างโมเดลและแอตทริบิวต์ของโมเดลสำหรับอินสแตนซ์ไฟล์ที่อัปโหลด คุณควรตรวจสอบการอัปโหลดไฟล์ด้วย
Step 1 - ภายใน models สร้างไฟล์ชื่อ UploadImageForm.php โดยมีเนื้อหาดังต่อไปนี้
<?php
namespace app\models;
use yii\base\Model;
class UploadImageForm extends Model {
public $image;
public function rules() {
return [
[['image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png'],
];
}
public function upload() {
if ($this->validate()) { $this->image->saveAs('../uploads/' . $this->image->baseName . '.' . $this->image->extension);
return true;
} else {
return false;
}
}
}
?>
imageแอตทริบิวต์ใช้เพื่อเก็บอินสแตนซ์ไฟล์ file กฎการตรวจสอบทำให้แน่ใจว่าไฟล์มีนามสกุล png หรือก jpgส่วนขยาย. อัปโหลดฟังก์ชั่นตรวจสอบไฟล์และบันทึกไว้บนเซิร์ฟเวอร์
Step 2 - ตอนนี้เพิ่มไฟล์ actionUploadImage ฟังก์ชันไปที่ SiteController.
public function actionUploadImage() {
$model = new UploadImageForm(); if (Yii::$app->request->isPost) {
$model->image = UploadedFile::getInstance($model, 'image');
if ($model->upload()) { // file is uploaded successfully echo "File successfully uploaded"; return; } } return $this->render('upload', ['model' => $model]);
}
Step 3 - เมื่อส่งแบบฟอร์มแล้วเราจะโทรไปที่ไฟล์ yii\web\UploadedFile::getInstance() เพื่อแสดงไฟล์ที่อัปโหลดเป็นไฟล์ UploadedFileตัวอย่าง. จากนั้นเราตรวจสอบความถูกต้องของไฟล์และบันทึกลงบนเซิร์ฟเวอร์
Step 4 - ถัดไปสร้างไฟล์ upload.php ดูไฟล์ภายในไฟล์ views/site ไดเรกทอรี
<?php
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']])?>
<?= $form->field($model, 'image')->fileInput() ?>
<button>Submit</button>
<?php ActiveForm::end() ?>
อย่าลืมเพิ่มไฟล์ enctype ตัวเลือกเมื่อคุณอัปโหลดไฟล์ The fileInput() วิธีการแสดงรหัส html ต่อไปนี้ -
<input type = "file">
โค้ด html ด้านบนช่วยให้ผู้ใช้สามารถเลือกและอัปโหลดไฟล์ได้
Step 5 - ทีนี้ถ้าคุณไปที่ http://localhost:8080/index.php?r=site/upload-imageคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/select_upload_files.jpg)
Step 6- เลือกภาพที่จะอัปโหลดและคลิกปุ่ม "ส่ง" ไฟล์จะถูกบันทึกไว้บนเซิร์ฟเวอร์ภายในไฟล์‘uploads’ โฟลเดอร์
![](https://post.nghiatu.com/assets/tutorial/yii/images/uploads.jpg)
ในการแสดงข้อมูลในรูปแบบที่อ่านได้คุณสามารถใช้ไฟล์ formatter ส่วนประกอบของแอปพลิเคชัน
Step1 - เพิ่มไฟล์ actionFormatter วิธีการ SiteController.
public function actionFormatter(){
return $this->render('formatter');
}
ในโค้ดด้านบนเราเพียงแค่แสดงไฟล์ formatter ดู.
Step 2 - ตอนนี้สร้างไฟล์ formatter.php ดูไฟล์ภายในไฟล์ views/site folder.
<?php
$formatter = \Yii::$app->formatter; // output: January 1, 2016 echo $formatter->asDate('2016-01-01', 'long'),"<br>";
// output: 51.50%
echo $formatter->asPercent(0.515, 2),"<br>"; // output: <a href = "mailto:[email protected]">[email protected]</a> echo $formatter->asEmail('[email protected]'),"<br>";
// output: Yes
echo $formatter->asBoolean(true),"<br>"; // output: (Not set) echo $formatter->asDate(null),"<br>";
?>
Step 3 - ไปที่ http://localhost:8080/index.php?r=site/formatterคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/view_file.jpg)
formatter ส่วนประกอบรองรับรูปแบบต่อไปนี้ที่เกี่ยวข้องกับวันที่และเวลา -
รูปแบบผลลัพธ์ | ตัวอย่าง |
---|---|
วันที่ | 1 มกราคม 2559 |
เวลา | 16:06 น |
วันเวลา | 01 มกราคม 2559 16:06 น |
การประทับเวลา | 1512609983 |
ญาติเวลา | 1 ชั่วโมงที่แล้ว |
ระยะเวลา | 5 นาที |
Step 4 - แก้ไขไฟล์ formatter ดูทางนี้
<?php
$formatter = \Yii::$app->formatter;
echo $formatter->asDate(date('Y-m-d'), 'long'),"<br>"; echo $formatter->asTime(date("Y-m-d")),"<br>";
echo $formatter->asDatetime(date("Y-m-d")),"<br>"; echo $formatter->asTimestamp(date("Y-m-d")),"<br>";
echo $formatter->asRelativeTime(date("Y-m-d")),"<br>";
?>
Step 5 - ประเภท http://localhost:8080/index.php?r=site/formatter ในแถบที่อยู่ของเว็บเบราว์เซอร์ของคุณคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/formatter_output.jpg)
รูปแบบวันที่
นอกจากนี้ยังมีทางลัดรูปแบบวันที่สี่แบบ: short, medium, long, and full.
Step 1 - แก้ไขไฟล์ formatter ดูไฟล์ด้วยวิธีนี้
<?php
$formatter = \Yii::$app->formatter; echo $formatter->asDate(date('Y-m-d'), 'short'),"<br>";
echo $formatter->asDate(date('Y-m-d'), 'medium'),"<br>"; echo $formatter->asDate(date('Y-m-d'), 'long'),"<br>";
echo $formatter->asDate(date('Y-m-d'), 'full'),"<br>";
?>
Step 2 - หากคุณไปที่เว็บเบราว์เซอร์แล้วพิมพ์ http://localhost:8080/index.php?r=site/formatterคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/data_formats_output.jpg)
รูปแบบตัวเลข
formatter ส่วนประกอบรองรับรูปแบบต่อไปนี้ที่เกี่ยวข้องกับตัวเลข -
รูปแบบผลลัพธ์ | ตัวอย่าง |
---|---|
จำนวนเต็ม | 51 |
ทศนิยม | 105.51 |
เปอร์เซ็นต์ | 51% |
วิทยาศาสตร์ | 1.050000E + 2 |
สกุลเงิน | 105 เหรียญ |
ขนาด | 105 ไบต์ |
shortSize | 105 บ |
Step 1 - แก้ไขไฟล์ formatter ดูทางนี้
<?php
$formatter = \Yii::$app->formatter;
echo Yii::$app->formatter->asInteger(105),"<br>"; echo Yii::$app->formatter->asDecimal(105.41),"<br>";
echo Yii::$app->formatter->asPercent(0.51),"<br>"; echo Yii::$app->formatter->asScientific(105),"<br>";
echo Yii::$app->formatter->asCurrency(105, "$"),"<br>";
echo Yii::$app->formatter->asSize(105),"<br>"; echo Yii::$app->formatter->asShortSize(105),"<br>";
?>
Step 2 - ไปที่ http://localhost:8080/index.php?r=site/formatterคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/number_formats_output.jpg)
รูปแบบอื่น ๆ
Yii ยังรองรับรูปแบบอื่น ๆ -
text - ค่านี้เข้ารหัส HTML
raw - ค่าจะแสดงผลตามที่เป็นอยู่
paragraphs- ค่านี้จัดรูปแบบเป็นย่อหน้าข้อความ HTML ที่รวมอยู่ในแท็กp
ntext - ค่านี้จัดรูปแบบเป็นข้อความธรรมดา HTML โดยที่บรรทัดใหม่จะถูกแปลงเป็นตัวแบ่งบรรทัด
html - ค่านี้ถูกทำให้บริสุทธิ์โดยใช้ HtmlPurifier เพื่อหลีกเลี่ยงการโจมตี XSS
image - ค่านี้จัดรูปแบบเป็นแท็กรูปภาพ
boolean - ค่าถูกจัดรูปแบบเป็นบูลีน
url - ค่าถูกจัดรูปแบบเป็นลิงก์
email - ค่านี้อยู่ในรูปแบบ mailto-link
ฟอร์แมตเตอร์อาจใช้โลแคลที่ใช้งานอยู่ในปัจจุบันเพื่อกำหนดวิธีจัดรูปแบบค่าสำหรับประเทศที่ระบุ
ตัวอย่างต่อไปนี้แสดงวิธีจัดรูปแบบวันที่สำหรับสถานที่ต่างๆ
<?php
Yii::$app->formatter->locale = 'ru-RU'; echo Yii::$app->formatter->asDate('2016-01-01'); // output: 1 января 2016 г.
Yii::$app->formatter->locale = 'de-DE'; // output: 1. Januar 2016 echo Yii::$app->formatter->asDate('2016-01-01');
Yii::$app->formatter->locale = 'en-US'; // output: January 1, 2016 echo Yii::$app->formatter->asDate('2016-01-01');
?>
เมื่อคุณมีข้อมูลมากเกินไปที่จะแสดงในหน้าเดียวคุณควรแสดงข้อมูลในหลายหน้า ซึ่งเรียกอีกอย่างว่าเลขหน้า
ในการแสดงการใช้เลขหน้าเราจำเป็นต้องมีข้อมูล
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในเทอร์มินัลให้รันmysql -u root -p
สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
MyUser โมเดลปรากฏในไดเร็กทอรีโมเดล
เลขหน้าในการดำเนินการ
Step 1 - เพิ่มไฟล์ actionPagination วิธีการ SiteController.
public function actionPagination() {
//preparing the query
$query = MyUser::find();
// get the total number of users
$count = $query->count();
//creating the pagination object
$pagination = new Pagination(['totalCount' => $count, 'defaultPageSize' => 10]);
//limit the query using the pagination and retrieve the users
$models = $query->offset($pagination->offset) ->limit($pagination->limit)
->all();
return $this->render('pagination', [ 'models' => $models,
'pagination' => $pagination,
]);
}
Step 2 - สร้างไฟล์ดูชื่อ pagination.php ข้างใน views/site โฟลเดอร์
<?php
use yii\widgets\LinkPager;
?>
<?php foreach ($models as $model): ?> <?= $model->id; ?>
<?= $model->name; ?> <?= $model->email; ?>
<br/>
<?php endforeach; ?>
<?php
// display pagination
echo LinkPager::widget([
'pagination' => $pagination,
]);
?>
ตอนนี้ไปที่โฮสต์ในพื้นที่ http://localhost:8080/index.php?r=site/pagination ผ่านเว็บเบราว์เซอร์คุณจะเห็นวิดเจ็ตการแบ่งหน้า -
![](https://post.nghiatu.com/assets/tutorial/yii/images/pagination_widget.jpg)
เมื่อแสดงข้อมูลจำนวนมากเรามักจะต้องจัดเรียงข้อมูล Yii ใช้ไฟล์yii\data\Sort object เพื่อแสดงสคีมาการเรียงลำดับ
เราต้องการข้อมูลเพื่อแสดงการเรียงลำดับ
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในเทอร์มินัลให้รันmysql -u root –p
สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"], ["User2", "[email protected]"], ["User3", "[email protected]"], ["User4", "[email protected]"], ["User5", "[email protected]"], ["User6", "[email protected]"], ["User7", "[email protected]"], ["User8", "[email protected]"], ["User9", "[email protected]"], ["User10", "[email protected]"], ["User11", "[email protected]"], ]); } public function safeDown() { $this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
การเรียงลำดับในการดำเนินการ
Step 1 - เพิ่มไฟล์ actionSorting วิธีการ SiteController.
public function actionSorting() {
//declaring the sort object
$sort = new Sort([ 'attributes' => ['id', 'name', 'email'], ]); //retrieving all users $models = MyUser::find()
->orderBy($sort->orders) ->all(); return $this->render('sorting', [
'models' => $models, 'sort' => $sort,
]);
}
Step 2 - สร้างไฟล์ View เรียกว่าไฟล์ sorting inside โฟลเดอร์มุมมอง / ไซต์
<?php
// display links leading to sort actions
echo $sort->link('id') . ' | ' . $sort->link('name') . ' | ' . $sort->link('email'); ?><br/> <?php foreach ($models as $model): ?> <?= $model->id; ?>
<?= $model->name; ?> <?= $model->email; ?>
<br/>
<?php endforeach; ?>
Step 3 - ตอนนี้ถ้าคุณพิมพ์ http://localhost:8080/index.php?r=site/sorting ในเว็บเบราว์เซอร์คุณจะเห็นว่าฟิลด์ ID ชื่อและอีเมลสามารถจัดเรียงได้ดังที่แสดงในภาพต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/sorting_action.jpg)
นอกจากนี้ยังมีการเรียกตัวแปรสมาชิกคลาสใน PHP properties. พวกเขาแสดงถึงสถานะของชั้นเรียน Yii แนะนำคลาสที่เรียกว่าyii\base\Object. สนับสนุนการกำหนดคุณสมบัติผ่านgetter หรือ setter วิธีการเรียน
วิธีการเริ่มต้นด้วยคำ get. วิธีการตั้งค่าเริ่มต้นด้วยset. คุณสามารถใช้คุณสมบัติที่กำหนดโดย getters และ setters เช่นตัวแปรสมาชิกคลาส
เมื่อกำลังอ่านคุณสมบัติเมธอด getter จะถูกเรียกใช้ เมื่อมีการกำหนดคุณสมบัติเมธอด setter จะถูกเรียกใช้ คุณสมบัติที่กำหนดโดย getter คือread only หากไม่ได้กำหนดตัวตั้งค่า
Step 1 - สร้างไฟล์ชื่อ Taxi.php ภายในโฟลเดอร์ส่วนประกอบ
<?php
namespace app\components;
use yii\base\Object;
class Taxi extends Object {
private $_phone; public function getPhone() { return $this->_phone;
}
public function setPhone($value) { $this->_phone = trim($value);
}
}
?>
ในโค้ดด้านบนเรากำหนดคลาส Taxi ที่ได้มาจากคลาส Object เราตั้งรับ -getPhone() และเซ็ตเตอร์ - setPhone().
Step 2 - Nowเพิ่มไฟล์ actionProperties วิธีการ SiteController.
public function actionProperties() {
$object = new Taxi();
// equivalent to $phone = $object->getPhone();
$phone = $object->phone;
var_dump($phone); // equivalent to $object->setLabel('abc');
$object->phone = '79005448877'; var_dump($object);
}
ในฟังก์ชั่นข้างต้นเราได้สร้างวัตถุ Taxi พยายามเข้าถึงไฟล์ phone คุณสมบัติผ่าน getter และตั้งค่า phone คุณสมบัติผ่าน setter
Step 3 - ในเว็บเบราว์เซอร์ของคุณพิมพ์ http://localhost:8080/index.php?r=site/propertiesในแถบที่อยู่คุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/properties_output.jpg)
Yii มีชุดของคลาสผู้ให้บริการข้อมูลที่ห่อหุ้มการแบ่งหน้าและการเรียงลำดับ ผู้ให้บริการข้อมูลใช้ yii \ data \ DataProviderInterface สนับสนุนการดึงข้อมูลที่เรียงลำดับและแบ่งหน้า โดยปกติผู้ให้บริการข้อมูลจะทำงานกับวิดเจ็ตข้อมูล
Yii ประกอบด้วย -
ActiveDataProvider - การใช้งาน yii\db\ActiveQuery หรือ yii\db\Query เพื่อสืบค้นข้อมูลจากฐานข้อมูล
SqlDataProvider - เรียกใช้ SQL และส่งคืนข้อมูลเป็นอาร์เรย์
ArrayDataProvider - รับอาร์เรย์ขนาดใหญ่และส่งคืนส่วนหนึ่ง
คุณกำหนดพฤติกรรมการเรียงลำดับและการแบ่งหน้าของผู้ให้บริการข้อมูลโดยกำหนดค่า pagination และ sortคุณสมบัติ. วิดเจ็ตข้อมูลเช่นyii\grid\GridView, มีทรัพย์สินเรียก dataProviderซึ่งใช้อินสแตนซ์ของผู้ให้บริการข้อมูลและแสดงข้อมูลบนหน้าจอ
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในระยะขั้วMySQL -u -p
สร้างฐานข้อมูลใหม่ผ่าน CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
ผู้ให้บริการข้อมูลที่ใช้งานอยู่
Step 1 - สร้างฟังก์ชันที่เรียกว่า actionDataProvider ข้างใน SiteController.
public function actionDataProvider(){
$query = MyUser::find();
$provider = new ActiveDataProvider([ 'query' => $query,
'pagination' => [
'pageSize' => 2,
],
]);
// returns an array of users objects
$users = $provider->getModels();
var_dump($users);
}
ในโค้ดด้านบนเรากำหนดอินสแตนซ์ของไฟล์ ActiveDataProviderคลาสและแสดงผู้ใช้จากหน้าแรก yii\data\ActiveDataProvider คลาสใช้คอมโพเนนต์แอ็พพลิเคชัน DB เป็นการเชื่อมต่อ DB
Step 2 - หากคุณป้อนที่อยู่โฮสต์ในพื้นที่ http://localhost:8080/index.php?r=site/dataproviderคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/active_data_provider.jpg)
ผู้ให้บริการข้อมูล SQL
yii\data\SqlDataProvider คลาสทำงานกับคำสั่ง SQL ดิบ
Step 1 - แก้ไขไฟล์ actionDataProvider วิธีนี้
public function actionDataProvider() {
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user')->queryScalar(); $provider = new SqlDataProvider([
'sql' => 'SELECT * FROM user',
'totalCount' => $count, 'pagination' => [ 'pageSize' => 5, ], 'sort' => [ 'attributes' => [ 'id', 'name', 'email', ], ], ]); // returns an array of data rows $users = $provider->getModels(); var_dump($users);
}
Step 2 - ประเภท http://localhost:8080/index.php?r=site/data-provider ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/sql_data_provider_output.jpg)
Array Data Provider
yii\data\ArrayDataProviderคลาสดีที่สุดสำหรับการทำงานกับอาร์เรย์ขนาดใหญ่ องค์ประกอบในอาร์เรย์นี้อาจเป็นผลลัพธ์การสืบค้นของอินสแตนซ์ DAO หรือ Active Record ก็ได้
Step 1 - แก้ไขไฟล์ actionDataProvider วิธีนี้
public function actionDataProvider() {
$data = MyUser::find()->asArray()->all(); $provider = new ArrayDataProvider([
'allModels' => $data, 'pagination' => [ 'pageSize' => 3, ], 'sort' => [ 'attributes' => ['id', 'name'], ], ]); // get the rows in the currently requested page $users = $provider->getModels(); var_dump($users);
}
Step 2 - หากคุณไปที่อยู่ http://localhost:8080/index.php?r=site/data-provider ผ่านเว็บเบราว์เซอร์คุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/array_data_provider_output.jpg)
สังเกตว่าไม่เหมือนผู้ให้บริการข้อมูล SQL และผู้ให้บริการข้อมูลที่ใช้งานอยู่ Array Data Provider โหลดข้อมูลทั้งหมดลงในหน่วยความจำดังนั้นจึงมีประสิทธิภาพน้อยกว่า
Yii มีชุดวิดเจ็ตสำหรับแสดงข้อมูล คุณสามารถใช้วิดเจ็ต DetailView เพื่อแสดงเรกคอร์ดเดียว วิดเจ็ต ListView เช่นเดียวกับ Grid View สามารถใช้เพื่อแสดงตารางของระเบียนที่มีคุณสมบัติเช่นการกรองการเรียงลำดับและการแบ่งหน้า
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในเทอร์มินัลให้รันmysql -u root –p
สร้างฐานข้อมูลใหม่ผ่าน CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
วิดเจ็ต DetailView
DetailView widgetแสดงข้อมูลของโมเดลเดียว $attributes คุณสมบัติกำหนดคุณลักษณะของโมเดลที่ควรจะแสดง
Step 1 - เพิ่มไฟล์ actionDataWidget วิธีการ SiteController.
public function actionDataWidget() {
$model = MyUser::find()->one(); return $this->render('datawidget', [
'model' => $model
]);
}
ในรหัสด้านบนเราพบว่า MyUser รุ่นแรกและส่งต่อไปยังไฟล์ datawidget ดู.
Step 2 - สร้างไฟล์ชื่อ datawidget.php ข้างใน views/site โฟลเดอร์
<?php
use yii\widgets\DetailView;
echo DetailView::widget([
'model' => $model,
'attributes' => [
'id',
//formatted as html
'name:html',
[
'label' => 'e-mail',
'value' => $model->email,
],
],
]);
?>
Step 3 - หากคุณไปที่ http://localhost:8080/index.php?r=site/data-widgetคุณจะเห็นการใช้งานไฟล์ DetailView วิดเจ็ต
![](https://post.nghiatu.com/assets/tutorial/yii/images/detailview_widget.jpg)
วิดเจ็ต ListView ใช้ผู้ให้บริการข้อมูลเพื่อแสดงข้อมูล แต่ละโมเดลแสดงผลโดยใช้ไฟล์มุมมองที่ระบุ
Step 1 - แก้ไขไฟล์ actionDataWidget() วิธีนี้
public function actionDataWidget() {
$dataProvider = new ActiveDataProvider([
'query' => MyUser::find(),
'pagination' => [
'pageSize' => 20,
],
]);
return $this->render('datawidget', [ 'dataProvider' => $dataProvider
]);
}
ในโค้ดด้านบนเราสร้างผู้ให้บริการข้อมูลและส่งต่อไปยังมุมมองดาต้าวิดเจ็ต
Step 2 - แก้ไขไฟล์มุมมอง datawidget ด้วยวิธีนี้
<?php
use yii\widgets\ListView;
echo ListView::widget([
'dataProvider' => $dataProvider,
'itemView' => '_user',
]);
?>
เราแสดงวิดเจ็ต ListView แต่ละรุ่นแสดงผลในมุมมอง_user
Step 3 - สร้างไฟล์ชื่อ _user.php ข้างใน views/site โฟลเดอร์
<?php
use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
?>
<div class = "user">
<?= $model->id ?>
<?= Html::encode($model->name) ?> <?= HtmlPurifier::process($model->email) ?>
</div>
Step 4 - ประเภท http://localhost:8080/index.php?r=site/data-widget ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/listview_widget_example_output.jpg)
วิดเจ็ต GridView รับข้อมูลจากผู้ให้บริการข้อมูลและนำเสนอข้อมูลในรูปแบบของตาราง แต่ละแถวของตารางแสดงรายการข้อมูลเดียวและคอลัมน์แสดงถึงแอตทริบิวต์ของรายการ
Step 1 - แก้ไขไฟล์ datawidget ดูทางนี้
<?php
use yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
]);
?>
Step 2 - ไปที่ http://localhost:8080/index.php?r=site/data-widgetคุณจะเห็นการใช้งานวิดเจ็ต DataGrid โดยทั่วไป
![](https://post.nghiatu.com/assets/tutorial/yii/images/datagrid_widget.jpg)
คอลัมน์ของวิดเจ็ต DataGrid ได้รับการกำหนดค่าในรูปแบบ yii\grid\Columnชั้นเรียน. แสดงถึงแอตทริบิวต์แบบจำลองและสามารถกรองและจัดเรียงได้
Step 3 - หากต้องการเพิ่มคอลัมน์ที่กำหนดเองลงในตารางให้แก้ไขไฟล์ datawidget ดูทางนี้
<?php
yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
[
'class' => 'yii\grid\DataColumn', // can be omitted, as it is the default
'label' => 'Name and email',
'value' => function ($data) { return $data->name . " writes from " . $data->email;
},
],
],
]);
?>
Step 4 - หากคุณไปที่อยู่ http://localhost:8080/index.php?r=site/data-widgetคุณจะเห็นผลลัพธ์ดังแสดงในภาพต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/datagrid_view.jpg)
คอลัมน์กริดสามารถปรับแต่งได้โดยใช้คลาสคอลัมน์ต่างๆเช่น yii \ grid \ SerialColumn, yii \ grid \ ActionColumn และ yii \ grid \ CheckboxColumn
Step 5 - แก้ไขไฟล์ datawidget ดูด้วยวิธีต่อไปนี้
<?php
use yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn'], 'name',
['class' => 'yii\grid\ActionColumn'],
['class' => 'yii\grid\CheckboxColumn'],
],
]);
?>
Step 6 − ไปที่ http://localhost:8080/index.php?r=site/data-widgetคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/modified_datagrid_view.jpg)
คุณสามารถใช้ได้ eventsเพื่อฉีดโค้ดที่กำหนดเองที่จุดดำเนินการบางจุด คุณสามารถแนบโค้ดที่กำหนดเองกับเหตุการณ์และเมื่อเหตุการณ์ถูกเรียกใช้โค้ดจะถูกเรียกใช้งาน ตัวอย่างเช่นวัตถุคนตัดไม้อาจทริกเกอร์ไฟล์userRegisteredเหตุการณ์เมื่อผู้ใช้ใหม่ลงทะเบียนบนเว็บไซต์ของคุณ หากคลาสต้องการทริกเกอร์เหตุการณ์คุณควรขยายจากคลาส yii \ base \ Component
ตัวจัดการเหตุการณ์คือการเรียกกลับ PHP คุณสามารถใช้การโทรกลับต่อไปนี้ -
ฟังก์ชัน PHP ส่วนกลางที่ระบุเป็นสตริง
ฟังก์ชันที่ไม่ระบุชื่อ
อาร์เรย์ของชื่อคลาสและเมธอดเป็นสตริงตัวอย่างเช่น ['ClassName', 'methodName']
อาร์เรย์ของอ็อบเจ็กต์และเมธอดเป็นสตริงตัวอย่างเช่น [$ obj, 'methodName']
Step 1 - ในการแนบตัวจัดการกับเหตุการณ์คุณควรโทรไปที่ไฟล์ yii\base\Component::on() วิธี.
$obj = new Obj;
// this handler is a global function
$obj->on(Obj::EVENT_HELLO, 'function_name'); // this handler is an object method $obj->on(Obj::EVENT_HELLO, [$object, 'methodName']); // this handler is a static class method $obj->on(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);
// this handler is an anonymous function
$obj->on(Obj::EVENT_HELLO, function ($event) {
// event handling logic
});
คุณสามารถแนบตัวจัดการหนึ่งตัวขึ้นไปกับเหตุการณ์ได้ ตัวจัดการที่แนบมาจะถูกเรียกตามลำดับที่แนบมากับเหตุการณ์
Step 2 - หากต้องการหยุดการเรียกใช้ตัวจัดการคุณควรตั้งค่า yii\base\Event::$handled property ถึง true.
$obj->on(Obj::EVENT_HELLO, function ($event) { $event->handled = true;
});
Step 3 - หากต้องการแทรกตัวจัดการที่จุดเริ่มต้นของคิวคุณสามารถโทร yii\base\Component::on()ส่งผ่านเท็จสำหรับพารามิเตอร์ที่สี่
$obj->on(Obj::EVENT_HELLO, function ($event) {
// ...
}, $data, false);
Step 4 - หากต้องการเรียกใช้เหตุการณ์ให้โทรไปที่ไฟล์ yii\base\Component::trigger() วิธี.
namespace app\components;
use yii\base\Component;
use yii\base\Event;
class Obj extends Component {
const EVENT_HELLO = 'hello';
public function triggerEvent() {
$this->trigger(self::EVENT_HELLO);
}
}
Step 5 - ในการแยกตัวจัดการออกจากเหตุการณ์คุณควรโทรไปที่ไฟล์ yii\base\Component::off() วิธี.
$obj = new Obj; // this handler is a global function $obj->off(Obj::EVENT_HELLO, 'function_name');
// this handler is an object method
$obj->off(Obj::EVENT_HELLO, [$object, 'methodName']);
// this handler is a static class method
$obj->off(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']); // this handler is an anonymous function $obj->off(Obj::EVENT_HELLO, function ($event) {
// event handling logic
});
ในบทนี้เราจะเห็นการสร้างเหตุการณ์ใน Yii เราต้องการข้อมูลเพื่อแสดงเหตุการณ์ที่กำลังดำเนินการอยู่
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในเทอร์มินัลให้รันmysql -u root –p
สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"], ["User2", "[email protected]"], ["User3", "[email protected]"], ["User4", "[email protected]"], ["User5", "[email protected]"], ["User6", "[email protected]"], ["User7", "[email protected]"], ["User8", "[email protected]"], ["User9", "[email protected]"], ["User10", "[email protected]"], ["User11", "[email protected]"], ]); } public function safeDown() { $this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
สร้างกิจกรรม
สมมติว่าเราต้องการส่งอีเมลไปยังผู้ดูแลระบบเมื่อใดก็ตามที่ผู้ใช้ใหม่ลงทะเบียนบนเว็บไซต์ของเรา
Step 1 - แก้ไขไฟล์ models/MyUser.php ยื่นด้วยวิธีนี้
<?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';
}
}
?>
ในโค้ดด้านบนเรากำหนดเหตุการณ์ "ผู้ใช้ใหม่" จากนั้นในวิธีการ init () เราแนบไฟล์sendMailToAdminฟังก์ชันสำหรับเหตุการณ์“ ผู้ใช้ใหม่” ตอนนี้เราจำเป็นต้องเริ่มเหตุการณ์นี้
Step 2 - สร้างเมธอดที่เรียกว่า actionTestEvent ใน SiteController
public function actionTestEvent() {
$model = new MyUser(); $model->name = "John";
$model->email = "[email protected]"; if($model->save()) {
$model->trigger(MyUser::EVENT_NEW_USER);
}
}
ในโค้ดด้านบนเราสร้างผู้ใช้ใหม่และทริกเกอร์เหตุการณ์ "ผู้ใช้ใหม่"
Step 3 - ตอนนี้พิมพ์ http://localhost:8080/index.php?r=site/test-eventคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/creating_event.jpg)
พฤติกรรมเป็นอินสแตนซ์ของคลาส yii \ base \ Behavior พฤติกรรมฉีดเมธอดและคุณสมบัติของมันไปยังส่วนประกอบที่แนบมา พฤติกรรมยังสามารถตอบสนองต่อเหตุการณ์ที่ถูกเรียกโดยคอมโพเนนต์
Step 1 - ในการกำหนดพฤติกรรมให้ขยายไฟล์ yii\base\Behavior ชั้นเรียน.
namespace app\components;
use yii\base\Behavior;
class MyBehavior extends Behavior {
private $_prop1;
public function getProp1() {
return $this->_prop1; } public function setProp1($value) {
$this->_prop1 = $value;
}
public function myFunction() {
// ...
}
}
โค้ดด้านบนกำหนดลักษณะการทำงานด้วยคุณสมบัติหนึ่ง (prop1) และหนึ่งวิธี (myFunction) เมื่อพฤติกรรมนี้แนบไปกับส่วนประกอบส่วนประกอบนั้นก็จะมีนามสกุลprop1 ทรัพย์สินและ myFunction วิธี.
ในการเข้าถึงคอมโพเนนต์ลักษณะการทำงานที่แนบมาคุณสามารถใช้ไฟล์ yii\base\Behavior::$owner property.
Step 2 - หากคุณต้องการให้พฤติกรรมตอบสนองต่อเหตุการณ์ของคอมโพเนนต์คุณควรลบล้างไฟล์ yii\base\Behavior::events() วิธี.
namespace app\components;
use yii\db\ActiveRecord;
use yii\base\Behavior;
class MyBehavior extends Behavior {
public function events() {
return [
ActiveRecord::EVENT_AFTER_VALIDATE => 'afterValidate',
];
}
public function afterValidate($event) {
// ...
}
}
Step 3 - หากต้องการแนบพฤติกรรมคุณควรลบล้างไฟล์ behaviors() วิธีการของคลาสส่วนประกอบ
namespace app\models;
use yii\db\ActiveRecord;
use app\components\MyBehavior;
class MyUser extends ActiveRecord {
public function behaviors() {
return [
// anonymous behavior, behavior class name only
MyBehavior::className(),
// named behavior, behavior class name only
'myBehavior2' => MyBehavior::className(),
// anonymous behavior, configuration array
[
'class' => MyBehavior::className(),
'prop1' => 'value1',
'prop2' => 'value2',
'prop3' => 'value3',
],
// named behavior, configuration array
'myBehavior4' => [
'class' => MyBehavior::className(),
'prop1' => 'value1'
]
];
}
}
Step 4 - หากต้องการแยกพฤติกรรมโทร the yii\base\Component::detachBehavior() วิธี.
$component->detachBehavior('myBehavior');
เราจำเป็นต้องมีข้อมูลเพื่อแสดงพฤติกรรม
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในระยะขั้วMySQL -u -p
สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"], ["User2", "[email protected]"], ["User3", "[email protected]"], ["User4", "[email protected]"], ["User5", "[email protected]"], ["User6", "[email protected]"], ["User7", "[email protected]"], ["User8", "[email protected]"], ["User9", "[email protected]"], ["User10", "[email protected]"], ["User11", "[email protected]"], ]); } public function safeDown() { $this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 − ภายในรูทโครงการ run./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ user table. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
สมมติว่าเราต้องการสร้างพฤติกรรมที่จะเป็นตัวพิมพ์ใหญ่ของคุณสมบัติ "ชื่อ" ของส่วนประกอบที่พฤติกรรมนั้นแนบมา
Step 1 - ภายในโฟลเดอร์ส่วนประกอบสร้างไฟล์ชื่อ UppercaseBehavior.php ด้วยรหัสต่อไปนี้
<?php
namespace app\components;
use yii\base\Behavior;
use yii\db\ActiveRecord;
class UppercaseBehavior extends Behavior {
public function events() {
return [
ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
];
}
public function beforeValidate($event) { $this->owner->name = strtoupper($this->owner->name);
}
}
?>
ในโค้ดด้านบนเราสร้างไฟล์ UppercaseBehaviorซึ่งเป็นตัวพิมพ์ใหญ่ของคุณสมบัติ name เมื่อเหตุการณ์“ beforeValidate” ถูกทริกเกอร์
Step 2 - หากต้องการแนบพฤติกรรมนี้กับไฟล์ MyUser แบบจำลองแก้ไขด้วยวิธีนี้
<?php
namespace app\models;
use app\components\UppercaseBehavior;
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 {
public function behaviors() {
return [
// anonymous behavior, behavior class name only
UppercaseBehavior::className(),
];
}
/**
* @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',
];
}
}
ตอนนี้เมื่อใดก็ตามที่เราสร้างหรืออัปเดตผู้ใช้คุณสมบัติ name จะเป็นตัวพิมพ์ใหญ่
Step 3 - เพิ่มไฟล์ actionTestBehavior ฟังก์ชันไปที่ SiteController.
public function actionTestBehavior() {
//creating a new user
$model = new MyUser(); $model->name = "John";
$model->email = "[email protected]"; if($model->save()){
var_dump(MyUser::find()->asArray()->all());
}
}
Step 4 - ประเภท http://localhost:8080/index.php?r=site/test-behavior ในแถบที่อยู่คุณจะเห็นว่าไฟล์ name ทรัพย์สินของคุณที่สร้างขึ้นใหม่ MyUser โมเดลเป็นตัวพิมพ์ใหญ่
![](https://post.nghiatu.com/assets/tutorial/yii/images/uppercasebehavior.jpg)
การกำหนดค่าใช้เพื่อสร้างอ็อบเจ็กต์ใหม่หรือเริ่มต้นอ็อบเจ็กต์ที่มีอยู่ โดยปกติแล้วการกำหนดค่าจะประกอบด้วยชื่อคลาสและรายการค่าเริ่มต้น นอกจากนี้ยังอาจรวมถึงรายการตัวจัดการเหตุการณ์และพฤติกรรม
ต่อไปนี้เป็นตัวอย่างของการกำหนดค่าฐานข้อมูล -
<?php
$config = [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host = localhost;dbname = helloworld', 'username' => 'vladimir', 'password' => '12345', 'charset' => 'utf8', ]; $db = Yii::createObject($config);
?>
Yii::createObject() วิธีใช้อาร์เรย์การกำหนดค่าและสร้างวัตถุตามคลาสที่มีชื่อในการกำหนดค่า
รูปแบบของการกำหนดค่า -
[
//a fully qualified class name for the object being created
'class' => 'ClassName',
//initial values for the named property
'propertyName' => 'propertyValue',
//specifies what handlers should be attached to the object's events
'on eventName' => $eventHandler,
//specifies what behaviors should be attached to the object
'as behaviorName' => $behaviorConfig,
]
ไฟล์การกำหนดค่าของเทมเพลตแอปพลิเคชันพื้นฐานเป็นหนึ่งในไฟล์ที่ซับซ้อนที่สุด -
<?php
$params = require(__DIR__ . '/params.php');
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this //is required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'urlManager' => [ //'showScriptName' => false, //'enablePrettyUrl' => true, //'enableStrictParsing' => true, //'suffix' => '/' ], 'db' => require(__DIR__ . '/db.php'), ], 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
ในไฟล์กำหนดค่าด้านบนเราไม่ได้กำหนดชื่อคลาส เนื่องจากเราได้กำหนดไว้แล้วในไฟล์index.php ไฟล์ -
<?php
//defining global constans
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
//register composer autoloader
require(__DIR__ . '/../vendor/autoload.php');
//include yii files
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
//load application config
$config = require(__DIR__ . '/../config/web.php');
//create, config, and process request
(new yii\web\Application($config))->run();
?>
วิดเจ็ตจำนวนมากยังใช้การกำหนดค่าตามที่แสดงในโค้ดต่อไปนี้
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
Yii::$app->user->isGuest ? ['label' => 'Login', 'url' => ['/site/login']] : [ 'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post']
],
],
]);
NavBar::end();
?>
เมื่อการกำหนดค่าซับซ้อนเกินไปแนวทางปฏิบัติทั่วไปคือการสร้างไฟล์ PHP ซึ่งจะส่งคืนอาร์เรย์ ลองดูที่ไฟล์config/console.php ไฟล์กำหนดค่า -
<?php
Yii::setAlias('@tests', dirname(__DIR__) . '/tests');
$params = require(__DIR__ . '/params.php'); $db = require(__DIR__ . '/db.php');
return [
'id' => 'basic-console',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log', 'gii'],
'controllerNamespace' => 'app\commands',
'modules' => [
'gii' => 'yii\gii\Module',
],
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => $db, ], 'params' => $params,
];
?>
การกำหนดค่าเริ่มต้นสามารถระบุได้โดยเรียกไฟล์ Yii::$container->set()วิธี. ช่วยให้คุณสามารถใช้การกำหนดค่าเริ่มต้นกับอินสแตนซ์ทั้งหมดของคลาสที่ระบุเมื่อถูกเรียกผ่านไฟล์Yii::createObject() วิธี.
ตัวอย่างเช่นในการปรับแต่งไฟล์ yii\widgets\LinkPager คลาสเพื่อให้เพจเจอร์ลิงค์ทั้งหมดแสดงปุ่มได้สูงสุดสามปุ่มคุณสามารถใช้โค้ดต่อไปนี้
\Yii::$container->set('yii\widgets\LinkPager', [
'maxButtonCount' => 3,
]);
คอนเทนเนอร์ DI (การฉีดพึ่งพา) เป็นวัตถุที่รู้วิธีสร้างอินสแตนซ์และกำหนดค่าวัตถุ Yii จัดหาคอนเทนเนอร์ DI ผ่านทางyii\di\Container class.
รองรับ DI ประเภทต่อไปนี้ -
- Setter และการฉีดคุณสมบัติ
- PHP callable injection
- การฉีดตัวสร้าง
- การฉีดตัวควบคุม
คอนเทนเนอร์ DI รองรับการฉีดคอนสตรัคเตอร์ด้วยคำแนะนำประเภท -
class Object1 {
public function __construct(Object2 $object2) { } } $object1 = $container->get('Object1'); // which is equivalent to the following: $object2 = new Object2;
$object1 = new Object1($object2);
การฉีดคุณสมบัติและตัวตั้งค่าได้รับการสนับสนุนผ่านการกำหนดค่า -
<?php
use yii\base\Object;
class MyObject extends Object {
public $var1; private $_var2;
public function getVar2() {
return $this->_var2; } public function setVar2(MyObject2 $var2) {
$this->_var2 = $var2;
}
}
$container->get('MyObject', [], [ 'var1' => $container->get('MyOtherObject'),
'var2' => $container->get('MyObject2'),
]);
?>
ในกรณีของ PHP callable injection คอนเทนเนอร์จะใช้การเรียกกลับ PHP ที่ลงทะเบียนเพื่อสร้างอินสแตนซ์ใหม่ของคลาส -
$container->set('Object1', function () {
$object1 = new Object1(new Object2); return $object1;
});
$object1 = $container->get('Object1');
Controller action injection เป็นประเภทของ DI ที่มีการประกาศการอ้างอิงโดยใช้คำแนะนำประเภท มีประโยชน์ในการรักษาตัวควบคุม MVC ให้มีน้ำหนักเบาและเพรียวบาง -
public function actionSendToAdmin(EmailValidator $validator, $email) {
if ($validator->validate($email)) {
// sending email
}
}
คุณสามารถใช้ไฟล์ yii\db\Container::set() วิธีการลงทะเบียนการอ้างอิง -
<?php
$container = new \yii\di\Container; // register a class name as is. This can be skipped. $container->set('yii\db\Connection');
// register an alias name. You can use $container->get('MyObject') // to create an instance of Connection $container->set('MyObject', 'yii\db\Connection');
// register an interface
// When a class depends on the interface, the corresponding class
// will be instantiated as the dependent object
$container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer'); // register an alias name with class configuration // In this case, a "class" element is required to specify the class $container->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
]);
// register a class with configuration. The configuration
// will be applied when the class is instantiated by get()
$container->set('yii\db\Connection', [ 'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld', 'username' => 'vladimir', 'password' => '12345', 'charset' => 'utf8', ]); // register a PHP callable // The callable will be executed each time when $container->get('db') is called
$container->set('db', function ($container, $params, $config) {
return new \yii\db\Connection($config); }); // register a component instance // $container->get('pageCache') will return the same instance each time when it
//is called
$container->set('pageCache', new FileCache);
?>
การใช้ DI
Step 1 - ภายใน components โฟลเดอร์สร้างไฟล์ชื่อ MyInterface.php ด้วยรหัสต่อไปนี้
<?php
namespace app\components;
interface MyInterface {
public function test();
}
?>
Step 2 - ภายในโฟลเดอร์ส่วนประกอบสร้างไฟล์สองไฟล์
First.php -
<?php
namespace app\components;
use app\components\MyInterface;
class First implements MyInterface {
public function test() {
echo "First class <br>";
}
}
?>
Second.php -
<?php
app\components;
use app\components\MyInterface;
class Second implements MyInterface {
public function test() {
echo "Second class <br>";
}
}
?>
Step 3 - ตอนนี้เพิ่มไฟล์ actionTestInterface ไปยัง SiteController
public function actionTestInterface() {
$container = new \yii\di\Container();
$container->set ("\app\components\MyInterface","\app\components\First"); $obj = $container->get("\app\components\MyInterface"); $obj->test(); // print "First class"
$container->set ("\app\components\MyInterface","\app\components\Second"); $obj = $container->get("\app\components\MyInterface"); $obj->test(); // print "Second class"
}
Step 4 - ไปที่ http://localhost:8080/index.php?r=site/test-interface คุณควรเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/using_di.jpg)
วิธีนี้สะดวกเนื่องจากเราสามารถตั้งค่าชั้นเรียนได้ในที่เดียวและรหัสอื่น ๆ จะใช้คลาสใหม่โดยอัตโนมัติ
Yii DAO (Database Access Object) จัดเตรียม API สำหรับการเข้าถึงฐานข้อมูล นอกจากนี้ยังทำหน้าที่เป็นรากฐานสำหรับวิธีการเข้าถึงฐานข้อมูลอื่น ๆ : บันทึกที่ใช้งานอยู่และตัวสร้างแบบสอบถาม
Yii DAO รองรับฐานข้อมูลต่อไปนี้ -
- MySQL
- MSSQL
- SQLite
- MariaDB
- PostgreSQL
- ORACLE
- CUBRID
การสร้างการเชื่อมต่อฐานข้อมูล
Step 1 - ในการสร้างการเชื่อมต่อฐานข้อมูลคุณต้องสร้างอินสแตนซ์ของคลาส yii \ db \ Connection
$mydb = new yii\db\Connection([
'dsn' => 'mysql:host=localhost;dbname=mydb',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
]);
แนวทางปฏิบัติทั่วไปคือการกำหนดค่าการเชื่อมต่อ DB ภายในส่วนประกอบของแอ็พพลิเคชัน ตัวอย่างเช่นในเทมเพลตแอ็พพลิเคชันพื้นฐานคอนฟิกูเรชันการเชื่อมต่อ DB จะอยู่ในไฟล์config/db.php ตามที่แสดงในรหัสต่อไปนี้
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '123574896',
'charset' => 'utf8',
];
?>
Step 2 - ในการเข้าถึงการเชื่อมต่อ DB คุณอาจใช้นิพจน์นี้
Yii::$app->db
ในการกำหนดค่าการเชื่อมต่อ DB คุณควรระบุ DSN (ชื่อแหล่งข้อมูล) ผ่านไฟล์ dsnทรัพย์สิน. รูปแบบ DSN แตกต่างกันไปสำหรับฐานข้อมูลที่แตกต่างกัน -
MySQL, MariaDB - mysql: host = localhost; dbname = mydb
PostgreSQL - pgsql: host = localhost; port = 5432; dbname = mydb
SQLite - sqlite: / path / to / db / file
MS SQL Server (via sqlsrv driver) - sqlsrv: เซิร์ฟเวอร์ = localhost; ฐานข้อมูล = mydb
MS SQL Server (via mssql driver) - mssql: host = localhost; dbname = mydb
MS SQL Server (via dblib driver) - dblib: host = localhost; dbname = mydb
CUBRID - cubrid: dbname = mydb; host = localhost; port = 33000
Oracle - oci: dbname = // localhost: 1521 / mydb
เราต้องการข้อมูลเพื่อแสดงการสืบค้นฐานข้อมูล
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในระยะขั้วMySQL -u -p
สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
เพื่อเรียกใช้ไฟล์ SQL queryคุณควรทำตามขั้นตอนเหล่านี้ -
- สร้างyii \ db \ Commandด้วยแบบสอบถาม SQL
- ผูกพารามิเตอร์ (ไม่จำเป็น)
- ดำเนินการคำสั่ง
Step 1 - สร้างฟังก์ชันที่เรียกว่า actionTestDb ใน SiteController
public function actionTestDb(){
// return a set of rows. each row is an associative array of column names and values.
// an empty array is returned if the query returned no results
$users = Yii::$app->db->createCommand('SELECT * FROM user LIMIT 5') ->queryAll(); var_dump($users);
// return a single row (the first row)
// false is returned if the query has no result
$user = Yii::$app->db->createCommand('SELECT * FROM user WHERE id=1')
->queryOne();
var_dump($user); // return a single column (the first column) // an empty array is returned if the query returned no results $userName = Yii::$app->db->createCommand('SELECT name FROM user') ->queryColumn(); var_dump($userName);
// return a scalar value
// false is returned if the query has no result
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user')
->queryScalar();
var_dump($count);
}
ตัวอย่างข้างต้นแสดงวิธีการดึงข้อมูลจากฐานข้อมูลหลายวิธี
Step 2 - ไปที่ที่อยู่ http://localhost:8080/index.php?r=site/test-dbคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_actiontestdb_output.jpg)
สร้างคำสั่ง SQL
ในการสร้างคำสั่ง SQL ด้วยพารามิเตอร์คุณควรใช้แนวทางของพารามิเตอร์การผูกเพื่อป้องกันการแทรก SQL
Step 1 - แก้ไขไฟล์ actionTestDb วิธีนี้
public function actionTestDb() {
$firstUser = Yii::$app->db->createCommand('SELECT * FROM user WHERE id = :id') ->bindValue(':id', 1) ->queryOne(); var_dump($firstUser);
$params = [':id' => 2, ':name' => 'User2']; $secondUser = Yii::$app->db->createCommand('SELECT * FROM user WHERE id = :id AND name = :name') ->bindValues($params)
->queryOne();
var_dump($secondUser); //another approach $params = [':id' => 3, ':name' => 'User3'];
$thirdUser = Yii::$app->db->createCommand('SELECT * FROM user WHERE
id = :id AND name = :name', $params) ->queryOne(); var_dump($thirdUser);
}
ในโค้ดด้านบน -
bindValue() - ผูกค่าพารามิเตอร์เดียว
bindValues() - ผูกค่าพารามิเตอร์หลายค่า
Step 2 - หากคุณไปที่อยู่ http://localhost:8080/index.php?r=site/test-dbคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/modified_actiontestdb_output.jpg)
แทรกอัปเดตและลบแบบสอบถาม
สำหรับการสอบถาม INSERT, UPDATE และ DELETE คุณสามารถเรียกใช้วิธีการ insert (), update () และ delete ()
Step 1 - แก้ไขไฟล์ actionTestDb วิธีนี้
public function actionTestDb() {
public function actionTestDb(){
// INSERT (table name, column values)
Yii::$app->db->createCommand()->insert('user', [ 'name' => 'My New User', 'email' => '[email protected]', ])->execute(); $user = Yii::$app->db->createCommand('SELECT * FROM user WHERE name = :name') ->bindValue(':name', 'My New User') ->queryOne(); var_dump($user);
// UPDATE (table name, column values, condition)
Yii::$app->db->createCommand()->update('user', ['name' => 'My New User Updated'], 'name = "My New User"')->execute(); $user = Yii::$app->db->createCommand('SELECT * FROM user WHERE name = :name') ->bindValue(':name', 'My New User Updated') ->queryOne(); var_dump($user);
// DELETE (table name, condition)
Yii::$app->db->createCommand()->delete('user', 'name = "My New User Updated"')->execute(); $user = Yii::$app->db->createCommand('SELECT * FROM user WHERE name = :name') ->bindValue(':name', 'My New User Updated') ->queryOne(); var_dump($user);
}
}
Step 2 - พิมพ์ URL http://localhost:8080/index.php?r=site/test-db ในแถบที่อยู่ของเว็บเบราว์เซอร์และคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/insert_update_delete_queries_example.jpg)
ตัวสร้างแบบสอบถามช่วยให้คุณสร้างคิวรี SQL ด้วยวิธีทางโปรแกรม ตัวสร้างแบบสอบถามช่วยให้คุณเขียนโค้ดที่เกี่ยวข้องกับ SQL ที่อ่านได้มากขึ้น
ในการใช้ตัวสร้างแบบสอบถามคุณควรทำตามขั้นตอนเหล่านี้ -
- สร้างวัตถุ yii \ db \ Query
- เรียกใช้วิธีการสืบค้น
เพื่อสร้างไฟล์ yii\db\Query คุณควรเรียกใช้ฟังก์ชันตัวสร้างแบบสอบถามที่แตกต่างกันเพื่อกำหนดส่วนต่างๆของแบบสอบถาม SQL
Step 1 - หากต้องการแสดงการใช้งานทั่วไปของตัวสร้างแบบสอบถามให้แก้ไขไฟล์ actionTestDb วิธีนี้
public function actionTestDb() {
//generates "SELECT id, name, email FROM user WHERE name = 'User10';"
$user = (new \yii\db\Query()) ->select(['id', 'name', 'email']) ->from('user') ->where(['name' => 'User10']) ->one(); var_dump($user);
}
Step 2 - ไปที่ http://localhost:8080/index.php?r=site/test-dbคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/query_builder.jpg)
ฟังก์ชัน Where ()
where()ฟังก์ชันกำหนดส่วน WHERE ของแบบสอบถาม เพื่อระบุกWHERE เงื่อนไขคุณสามารถใช้สามรูปแบบ
string format - 'ชื่อ = User10'
hash format - ['name' => 'User10', 'email => [email protected]']
operator format - ['like', 'name', 'User']
ตัวอย่างรูปแบบ String
public function actionTestDb() {
$user = (new \yii\db\Query()) ->select(['id', 'name', 'email']) ->from('user') ->where('name = :name', [':name' => 'User11']) ->one(); var_dump($user);
}
ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/string_format_example_output.jpg)
ตัวอย่างรูปแบบ Hash
public function actionTestDb() {
$user = (new \yii\db\Query()) ->select(['id', 'name', 'email']) ->from('user') ->where([ 'name' => 'User5', 'email' => '[email protected]' ]) ->one(); var_dump($user);
}
ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/hash_format_example_output.jpg)
รูปแบบตัวดำเนินการช่วยให้คุณกำหนดเงื่อนไขตามอำเภอใจในรูปแบบต่อไปนี้ -
[operator, operand1, operand2]
ตัวดำเนินการสามารถ -
and - ['and', 'id = 1', 'id = 2'] จะสร้าง id = 1 AND id = 2 หรือ: คล้ายกับตัวดำเนินการและ
between - ['between', 'id', 1, 15] จะสร้าง id ระหว่าง 1 และ 15
not between - คล้ายกับตัวดำเนินการระหว่าง แต่ระหว่างนั้นจะถูกแทนที่ด้วย NOT BETWEEN
in - ['in', 'id', [5,10,15]] จะสร้าง id IN (5,10,15)
not in - คล้ายกับตัวดำเนินการ in แต่ IN ถูกแทนที่ด้วย NOT IN
like - ['like', 'name', 'user'] จะสร้างชื่อ LIKE '% user%'
or like - คล้ายกับตัวดำเนินการ like แต่ OR ใช้เพื่อแบ่งเพรดิเคต LIKE
not like - คล้ายกับตัวดำเนินการ like แต่ LIKE จะถูกแทนที่ด้วย NOT LIKE
or not like - คล้ายกับตัวดำเนินการ not like แต่ OR ใช้เพื่อต่อเพรดิเคตไม่ชอบ
exists - ต้องการตัวถูกดำเนินการหนึ่งตัวซึ่งต้องเป็นอินสแตนซ์ของคลาส yii \ db \ Query
not exists - คล้ายกับตัวดำเนินการที่มีอยู่ แต่สร้างนิพจน์ NOT EXISTS (แบบสอบถามย่อย)
<, <=, >, >=, หรือตัวดำเนินการ DB อื่น ๆ : ['<', 'id', 10] จะสร้าง id <10
ตัวอย่างรูปแบบตัวดำเนินการ
public function actionTestDb() {
$users = (new \yii\db\Query()) ->select(['id', 'name', 'email']) ->from('user') ->where(['between', 'id', 5, 7]) ->all(); var_dump($users);
}
ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/operator_format_example_output.jpg)
ฟังก์ชัน OrderBy ()
orderBy() ฟังก์ชันกำหนดส่วน ORDER BY
Example -
public function actionTestDb() {
$users = (new \yii\db\Query()) ->select(['id', 'name', 'email']) ->from('user') ->orderBy('name DESC') ->all(); var_dump($users);
}
ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/orderby_function_example_output.jpg)
groupBy () ฟังก์ชัน
groupBy() ฟังก์ชันกำหนดส่วน GROUP BY ในขณะที่ having() วิธีการระบุส่วน HAVING
Example -
public function actionTestDb() {
$users = (new \yii\db\Query()) ->select(['id', 'name', 'email']) ->from('user') ->groupBy('name') ->having('id < 5') ->all(); var_dump($users);
}
ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/groupby_function_example_output.jpg)
limit() และ offset() วิธีการกำหนด LIMIT และ OFFSET เศษ
Example -
public function actionTestDb() {
$users = (new \yii\db\Query()) ->select(['id', 'name', 'email']) ->from('user') ->limit(5) ->offset(5) ->all(); var_dump($users);
}
คุณสามารถดูผลลัพธ์ต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/limit_offset_fragments.jpg)
yii\db\Query คลาสมีชุดวิธีการสำหรับวัตถุประสงค์ที่แตกต่างกัน -
all() - ส่งคืนอาร์เรย์ของแถวคู่ชื่อ - ค่า
one() - ส่งคืนแถวแรก
column() - ส่งคืนคอลัมน์แรก
scalar() - ส่งคืนค่าสเกลาร์จากแถวแรกและคอลัมน์แรกของผลลัพธ์
exists() - ส่งกลับค่าที่ระบุว่าแบบสอบถามมีผลลัพธ์หรือไม่
count() ส่งคืนผลลัพธ์ของแบบสอบถาม COUNT รายการ
other aggregation query methods - รวมผลรวม ($q), average($q) สูงสุด ($q), min($q) พารามิเตอร์ $ q สามารถเป็นได้ทั้งชื่อคอลัมน์หรือนิพจน์ DB
Active Record จัดเตรียม API เชิงวัตถุสำหรับการเข้าถึงข้อมูล คลาส Active Record เชื่อมโยงกับตารางฐานข้อมูล
Yii ให้การสนับสนุน Active Record สำหรับฐานข้อมูลเชิงสัมพันธ์ต่อไปนี้ -
- MySQL 4.1 หรือใหม่กว่า
- SQLite 2 และ 3:
- PostgreSQL 7.3 หรือใหม่กว่า
- Microsoft SQL Server 2008 หรือใหม่กว่า
- CUBRID 9.3 หรือใหม่กว่า
- Oracle
- ElasticSearch
- Sphinx
นอกจากนี้คลาส Active Record ยังรองรับสิ่งต่อไปนี้ NoSQL ฐานข้อมูล -
- Redis 2.6.12 หรือใหม่กว่า
- MongoDB 1.3.0 หรือใหม่กว่า
หลังจากประกาศคลาส Active Record (MyUser model ในกรณีของเรา) สำหรับตารางฐานข้อมูลแยกต่างหากคุณควรทำตามขั้นตอนเหล่านี้เพื่อสืบค้นข้อมูลจากมัน -
- สร้างวัตถุแบบสอบถามใหม่โดยใช้เมธอด yii \ db \ ActiveRecord :: find ()
- สร้างวัตถุแบบสอบถาม
- เรียกวิธีการสืบค้นเพื่อดึงข้อมูล
Step 1 - แก้ไขไฟล์ actionTestDb() วิธีนี้
public function actionTestDb() {
// return a single user whose ID is 1
// SELECT * FROM `user` WHERE `id` = 1
$user = MyUser::find()
->where(['id' => 1])
->one();
var_dump($user); // return the number of users // SELECT COUNT(*) FROM `user` $users = MyUser::find()
->count();
var_dump($users); // return all users and order them by their IDs // SELECT * FROM `user` ORDER BY `id` $users = MyUser::find()
->orderBy('id')
->all();
var_dump($users);
}
โค้ดที่ระบุข้างต้นแสดงวิธีใช้ ActiveQuery เพื่อสืบค้นข้อมูล
Step 2 - ไปที่ http://localhost:8080/index.php?r=site/test-dbคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/active_record.jpg)
การสืบค้นตามค่าคีย์หลักหรือชุดของค่าคอลัมน์เป็นงานทั่วไปนั่นคือเหตุผลที่ Yii จัดเตรียมวิธีการดังต่อไปนี้ -
yii\db\ActiveRecord::findOne() - ส่งคืนอินสแตนซ์ Active Record เดียว
yi\db\ActiveRecord::findAll() - ส่งคืนอาร์เรย์ของอินสแตนซ์ Active Record
Example -
public function actionTestDb() {
// returns a single customer whose ID is 1
// SELECT * FROM `user` WHERE `id` = 1
$user = MyUser::findOne(1);
var_dump($user); // returns customers whose ID is 1,2,3, or 4 // SELECT * FROM `user` WHERE `id` IN (1,2,3,4) $users = MyUser::findAll([1, 2, 3, 4]);
var_dump($users); // returns a user whose ID is 5 // SELECT * FROM `user` WHERE `id` = 5 $user = MyUser::findOne([
'id' => 5
]);
var_dump($user);
}
บันทึกข้อมูลลงในฐานข้อมูล
ในการบันทึกข้อมูลลงในฐานข้อมูลคุณควรเรียกไฟล์ yii\db\ActiveRecord::save() วิธี.
Step 1 - แก้ไขไฟล์ actionTestDb() วิธีนี้
public function actionTestDb() {
// insert a new row of data
$user = new MyUser();
$user->name = 'MyCustomUser2'; $user->email = '[email protected]';
$user->save(); var_dump($user->attributes);
// update an existing row of data
$user = MyUser::findOne(['name' => 'MyCustomUser2']); $user->email = '[email protected]';
$user->save(); var_dump($user->attributes);
}
Step 2 - ไปที่ http://localhost:8080/index.php?r=site/test-dbคุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/save_data_database.jpg)
ในการลบข้อมูลแถวเดียวคุณควร -
ดึงข้อมูลอินสแตนซ์ Active Record
โทร yii\db\ActiveRecord::delete() วิธี
Step 1 - แก้ไขไฟล์ actionTestDb() วิธีนี้
public function actionTestDb() {
$user = MyUser::findOne(2); if($user->delete()) {
echo "deleted";
}
}
Step 2 - ประเภท http://localhost:8080/index.php?r=site/test-db ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นผลลัพธ์ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/delete_single_row_data.jpg)
Step 3 - คุณสามารถโทรไปที่ไฟล์ yii\db\ActiveRecord::deleteAll() วิธีการลบข้อมูลหลายแถวเช่น
public function actionTestDb() {
MyUser::deleteAll('id >= 20');
}
ในระหว่างการพัฒนาแอปพลิเคชันที่ขับเคลื่อนด้วยฐานข้อมูลโครงสร้างฐานข้อมูลจะพัฒนาไปพร้อมกับซอร์สโค้ด Yii ให้ไฟล์database migration คุณลักษณะที่ช่วยให้คุณติดตามการเปลี่ยนแปลงฐานข้อมูล
Yii มีเครื่องมือบรรทัดคำสั่งการโอนย้ายต่อไปนี้ -
- สร้างการย้ายข้อมูลใหม่
- เปลี่ยนกลับการย้ายข้อมูล
- ใช้การย้ายข้อมูล
- ใช้การย้ายข้อมูลซ้ำ
- แสดงสถานะการย้ายข้อมูลและประวัติ
การสร้างการย้ายข้อมูล
ให้เราสร้างการย้ายฐานข้อมูลใหม่
Step 1 - ภายในรูทโปรเจ็กต์ของเทมเพลตแอปพลิเคชันพื้นฐานให้เปิดหน้าต่างคอนโซลและเรียกใช้
./yii migrate/create add_news_table
คำสั่งดังกล่าวจะสร้างไฟล์การโอนย้ายใหม่ (ในกรณีนี้ m160113_102634_add_news_table.php) ใน migrations โฟลเดอร์
ไฟล์มีรหัสต่อไปนี้ -
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
}
public function down() {
echo "m160113_102634_add_news_table cannot be reverted.\n";
return false;
}
/*
// Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
การย้ายฐานข้อมูลแต่ละครั้งเป็นคลาส PHP ที่ขยายไฟล์ yii\db\Migrationชั้นเรียน. ชื่อคลาสถูกสร้างขึ้นในรูปแบบต่อไปนี้ -
m<YYMMDD_HHMMSS>_<Name>
ที่ไหน <YYMMDD_HMMSS> คือวันเวลา UTC ที่คำสั่งการโอนย้ายถูกเรียกใช้และ <Name> คืออาร์กิวเมนต์ที่คุณระบุในคำสั่งคอนโซล
เมธอด up () ถูกเรียกใช้เมื่อคุณอัพเกรดฐานข้อมูลของคุณในขณะที่เมธอด down () ถูกเรียกใช้เมื่อคุณดาวน์เกรด
Step 2 - หากต้องการเพิ่มตารางใหม่ในฐานข้อมูลให้แก้ไขไฟล์การย้ายข้อมูลด้วยวิธีนี้
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
$this->createTable("news", [ "id" => Schema::TYPE_PK, "title" => Schema::TYPE_STRING, "content" => Schema::TYPE_TEXT, ]); } public function down() { $this->dropTable('news');
}
/*
// Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
ในโค้ดด้านบนเราได้สร้างตารางใหม่ชื่อ news ในไฟล์ up() วิธีการและทิ้งตารางนี้ในไฟล์ down() วิธี.
newsตารางประกอบด้วยสามฟิลด์: id, title และ content เมื่อสร้างตารางหรือคอลัมน์เราควรใช้ชนิดนามธรรมเพื่อให้การย้ายข้อมูลไม่ขึ้นอยู่กับประเภทฐานข้อมูล ตัวอย่างเช่นในกรณีของ MySQL TYPE_PK จะถูกแปลงเป็น int (11) ไม่ใช่ NUL AUTO_INCREMETN PRIMARY KEY
Step 3 - ในการอัปเกรดฐานข้อมูลให้เรียกใช้คำสั่งนี้
./yii migrate
![](https://post.nghiatu.com/assets/tutorial/yii/images/upgrade_database.jpg)
คำสั่งดังกล่าวจะแสดงรายการการย้ายข้อมูลที่มีอยู่ทั้งหมดที่ยังไม่ได้ใช้ จากนั้นหากคุณยืนยันที่จะใช้การย้ายข้อมูลจะเรียกใช้ safeUp () หรือ up () ในคลาสการย้ายข้อมูลใหม่ทั้งหมด
Step 4 - หากต้องการใช้การย้ายข้อมูลเพียงสามรายการคุณสามารถเรียกใช้
./yii migrate 3
Step 5 - คุณยังสามารถกำหนดการย้ายฐานข้อมูลที่ควรจะย้ายไป
# โดยใช้การประทับเวลาเพื่อระบุการย้ายข้อมูล
yii migrate/to 160202_195501
# โดยใช้สตริงที่สามารถแยกวิเคราะห์โดย strtotime ()
yii migrate/to "2016-01-01 19:55:01"
# โดยใช้ชื่อเต็ม
yii migrate/to m160202_195501_create_news_table
# โดยใช้การประทับเวลา UNIX
yii migrate/to 1393964718
Step 6 - หากต้องการย้อนกลับการโอนย้าย (ดำเนินการลง () หรือวิธี safeDown () ให้เรียกใช้
./yii migrate/down
![](https://post.nghiatu.com/assets/tutorial/yii/images/revert_migration.jpg)
Step 7 - หากต้องการเปลี่ยนการย้ายข้อมูลที่ใช้ล่าสุดห้ารายการคุณสามารถเรียกใช้
./yii migrate/down 5
Step 8 - หากต้องการทำซ้ำ (เปลี่ยนกลับแล้วใช้อีกครั้ง) การย้ายข้อมูลให้เรียกใช้
./yii migrate/redo
![](https://post.nghiatu.com/assets/tutorial/yii/images/redo_migration.jpg)
หากต้องการแสดงรายการการย้ายข้อมูลที่ใช้แล้วให้ใช้คำสั่งเหล่านี้ -
yii migrate/new # แสดงการย้ายข้อมูลใหม่ 10 รายการแรก
yii migrate/new 3 # แสดงการย้ายข้อมูลใหม่ 3 รายการแรก
yii migrate/new all # แสดงการย้ายข้อมูลใหม่ทั้งหมด
yii migrate/history # แสดงการย้ายข้อมูลที่ใช้ 10 รายการล่าสุด
yii migrate/history 20 # แสดงการย้ายข้อมูลที่ใช้ 20 รายการล่าสุด
yii migrate/history all # แสดงการย้ายข้อมูลที่ใช้ทั้งหมด
บางครั้งคุณต้องเพิ่มหรือวางคอลัมน์จากตารางเฉพาะ คุณสามารถใช้ได้addColumn() และ dropColumn() วิธีการ
Step 1 - สร้างการย้ายข้อมูลใหม่
./yii migrate/create add_category_to_news
Step 2 - แก้ไขไฟล์การย้ายข้อมูลที่สร้างขึ้นใหม่ด้วยวิธีนี้
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function up() {
$this->addColumn('news', 'category', $this->integer());
}
public function down() {
$this->dropColumn('news', 'category');
}
}
?>
ตอนนี้ถ้าคุณเรียกใช้ ./yii migrateควรเพิ่มคอลัมน์หมวดหมู่ในตารางข่าว ในทางตรงกันข้ามถ้าคุณวิ่ง./yii migrate/down 1ควรทิ้งคอลัมน์หมวดหมู่
เมื่อดำเนินการย้ายฐานข้อมูลสิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่าการย้ายข้อมูลแต่ละครั้งประสบความสำเร็จหรือล้มเหลว ขอแนะนำให้ใส่การดำเนินการ DB ในธุรกรรม ในการใช้การโยกย้ายธุรกรรมคุณควรใส่รหัสการย้ายข้อมูลในไฟล์safeUp() และ safeDown()วิธีการ หากการดำเนินการใด ๆ ในวิธีการเหล่านี้ล้มเหลวการดำเนินการก่อนหน้านี้ทั้งหมดจะถูกย้อนกลับ
ตัวอย่างก่อนหน้านี้ใน "วิธีการทำธุรกรรม" จะเป็น -
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function safeUp() {
$this->addColumn('news', 'category', $this->integer()); } public function safeDown() { $this->dropColumn('news', 'category');
}
}
?>
yii\db\Migration คลาสจัดเตรียมวิธีการต่อไปนี้สำหรับการจัดการฐานข้อมูล -
execute() - ดำเนินการคำสั่ง SQL ดิบ
createTable() - สร้างตาราง
renameTable() - เปลี่ยนชื่อตาราง
insert() - แทรกแถวเดียว
batchInsert() - แทรกหลายแถว
update() - อัปเดตแถว
delete() - ลบแถว
addColumn() - เพิ่มคอลัมน์
renameColumn() - เปลี่ยนชื่อคอลัมน์
dropColumn() - ลบคอลัมน์
alterColumn() - เปลี่ยนคอลัมน์
dropTable() - ลบตาราง
truncateTable() - ลบแถวทั้งหมดในตาราง
createIndex() - สร้างดัชนี
dropIndex() - ลบดัชนี
addPrimaryKey() - เพิ่มคีย์หลัก
dropPrimaryKey() - ลบคีย์หลัก
addForeignKey() - เพิ่มคีย์ต่างประเทศ
dropForeignKey() - ลบคีย์ต่างประเทศ
ชุดรูปแบบช่วยให้คุณแทนที่ชุดมุมมองด้วยมุมมองอื่นโดยไม่จำเป็นต้องแก้ไขไฟล์มุมมองต้นฉบับ คุณควรตั้งค่าไฟล์theme คุณสมบัติของคอมโพเนนต์แอ็พพลิเคชันมุมมองเพื่อใช้ธีม
คุณควรกำหนดคุณสมบัติต่อไปนี้ -
yii\base\Theme::$basePath - กำหนดไดเร็กทอรีฐานสำหรับ CSS, JS, รูปภาพและอื่น ๆ
yii\base\Theme::$baseUrl - กำหนด URL พื้นฐานของทรัพยากรที่มีธีม
yii\base\Theme::$pathMap - กำหนดกฎการแทนที่
ตัวอย่างเช่นหากคุณโทร $this->render('create') ใน UserController ไฟล์ @app/views/user/create.phpดูไฟล์จะแสดงผล อย่างไรก็ตามหากคุณเปิดใช้งานการตั้งค่าดังกล่าวในการกำหนดค่าแอปพลิเคชันต่อไปนี้ไฟล์ view @ app / themes / basic / user / create.php จะแสดงผลแทน
Step 1 - แก้ไขไฟล์ config/web.php ยื่นด้วยวิธีนี้
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'view' => [
'theme' => [
'basePath' => '@app/themes/basic',
'baseUrl' => '@web/themes/basic',
'pathMap' => [
'@app/views' => '@app/themes/basic',
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
?>
เราได้เพิ่มส่วนประกอบแอปพลิเคชันมุมมอง
Step 2 - ตอนนี้สร้างไฟล์ web/themes/basic โครงสร้างไดเรกทอรีและ themes/basic/site. ภายในโฟลเดอร์ธีม / พื้นฐาน / ไซต์สร้างไฟล์ชื่อabout.php ด้วยรหัสต่อไปนี้
<?php
/* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views, meta, tags']); $this->registerMetaTag(['name' => 'description', 'content' => 'This is the
description of this page!'], 'description');
?>
<div class = "site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p style = "color: red;">
This is the About page. You may modify the following file to customize its content:
</p>
</div>
Step 3 - ไปที่ http://localhost:8080/index.php?r=site/about, themes/basic/site/about.php ไฟล์จะถูกแสดงผลแทนไฟล์ views/site/about.php.
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_themes.jpg)
Step 4 - สำหรับโมดูลธีมกำหนดค่าคุณสมบัติ yii \ base \ Theme :: $ pathMap ด้วยวิธีนี้
'pathMap' => [
'@app/views' => '@app/themes/basic',
'@app/modules' => '@app/themes/basic/modules',
],
Step 5 - สำหรับวิดเจ็ตธีมกำหนดค่าไฟล์ yii\base\Theme::$pathMap คุณสมบัติด้วยวิธีนี้
'pathMap' => [
'@app/views' => '@app/themes/basic',
'@app/widgets' => '@app/themes/basic/widgets', // <-- !!!
],
บางครั้งคุณต้องระบุธีมพื้นฐานที่มีรูปลักษณ์พื้นฐานของแอปพลิเคชัน เพื่อให้บรรลุเป้าหมายนี้คุณสามารถใช้การสืบทอดธีม
Step 6 - แก้ไขส่วนประกอบแอปพลิเคชันมุมมองด้วยวิธีนี้
'view' => [
'theme' => [
'basePath' => '@app/themes/basic',
'baseUrl' => '@web/themes/basic',
'pathMap' => [
'@app/views' => [
'@app/themes/christmas',
'@app/themes/basic',
],
]
],
],
ในการกำหนดค่าด้านบนไฟล์ @app/views/site/index.phpดูไฟล์จะมีธีมเป็น @ app / themes / christmas / site / index.php หรือ @ app / themes / basic / site / index.php ขึ้นอยู่กับไฟล์ที่มีอยู่ หากมีทั้งสองไฟล์ระบบจะใช้ไฟล์แรก
Step 7 - สร้างไฟล์ themes/christmas/site โครงสร้างไดเรกทอรี
Step 8 - ตอนนี้ภายในโฟลเดอร์ themes / christmas / site ให้สร้างไฟล์ชื่อ about.php ด้วยรหัสต่อไปนี้
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;
$this->title = 'About'; $this->params['breadcrumbs'][] = $this->title; $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing,
views, meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the
description of this page!'], 'description');
?>
<div class = "site-about">
<h2>Christmas theme</h2>
<img src = "http://pngimg.com/upload/fir_tree_PNG2514.png" alt = ""/>
<p style = "color: red;">
This is the About page. You may modify the following file to customize its content:
</p>
</div>
Step 9 - หากคุณไปที่ http://localhost:8080/index.php?r=site/aboutคุณจะเห็นหน้าเกี่ยวกับการอัปเดตโดยใช้ธีมคริสต์มาส
![](https://post.nghiatu.com/assets/tutorial/yii/images/christmas_theme.jpg)
Yii มีคุณสมบัติที่เป็นประโยชน์ต่อไปนี้สำหรับการใช้งาน RESTful APIs -
- การสร้างต้นแบบด่วน
- การกำหนดลำดับวัตถุที่ปรับแต่งได้
- รูปแบบการตอบกลับ (รองรับ JSON และ XML โดยค่าเริ่มต้น)
- การจัดรูปแบบข้อมูลการรวบรวมและข้อผิดพลาดในการตรวจสอบความถูกต้อง
- การกำหนดเส้นทางที่มีประสิทธิภาพ
- รองรับ HATEOAS
- การสนับสนุนในตัวสำหรับคำกริยา OPTIONS และ HEAD
- การแคชข้อมูลและการแคช HTTP
- การรับรองความถูกต้องและการอนุญาต
- การ จำกัด อัตรา
ในการแสดง RESTful APIs เราจำเป็นต้องมีข้อมูล
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในระยะขั้วMySQL -u -p
สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host = localhost;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"], ["User2", "[email protected]"], ["User3", "[email protected]"], ["User4", "[email protected]"], ["User5", "[email protected]"], ["User6", "[email protected]"], ["User7", "[email protected]"], ["User8", "[email protected]"], ["User9", "[email protected]"], ["User10", "[email protected]"], ["User11", "[email protected]"], ]); } public function safeDown() { $this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
การติดตั้งบุรุษไปรษณีย์
บุรุษไปรษณีย์เป็นเครื่องมือที่มีประโยชน์เมื่อพัฒนาบริการ RESTful มีอินเทอร์เฟซที่เป็นประโยชน์สำหรับการสร้างคำขอ
คุณสามารถค้นหาเครื่องมือนี้ได้ที่ https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en .
ในการติดตั้งให้กดปุ่ม "เพิ่มลงใน Chrome"
![](https://post.nghiatu.com/assets/tutorial/yii/images/installing_postman.jpg)
คลาสคอนโทรลเลอร์ขยายจาก yii\rest\ActiveControllerคลาสซึ่งใช้แอ็คชัน RESTful ทั่วไป เราระบุไฟล์$modelClass เพื่อให้คอนโทรลเลอร์รู้ว่าควรใช้โมเดลใดในการจัดการข้อมูล
Step 1 - สร้างไฟล์ชื่อ UserController.php ภายในโฟลเดอร์คอนโทรลเลอร์
<?php
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController {
public $modelClass = 'app\models\MyUser';
}
?>
ต่อไปเราต้องตั้งค่าส่วนประกอบ urlManager เพื่อให้สามารถเข้าถึงและจัดการข้อมูลผู้ใช้ด้วยคำกริยา HTTP ที่มีความหมายและ URL ที่สวยงาม ในการให้ API เข้าถึงข้อมูลใน JSON เราควรกำหนดค่าคุณสมบัติตัวแยกวิเคราะห์ของไฟล์request ส่วนประกอบของแอปพลิเคชัน
Step 2 - แก้ไขไฟล์ config/web.php ยื่นด้วยวิธีนี้ -
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is
//required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
],
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
?>
ด้วยความพยายามเพียงเล็กน้อยเราเพิ่งสร้าง RESTful API สำหรับเข้าถึงข้อมูลผู้ใช้ API ประกอบด้วย -
GET /users - แสดงรายชื่อผู้ใช้ทั้งหมดทีละหน้า
HEAD /users - แสดงข้อมูลภาพรวมของรายชื่อผู้ใช้
POST /users - สร้างผู้ใช้ใหม่
GET /users/20 - ส่งคืนรายละเอียดของผู้ใช้ 20
HEAD /users/20 - แสดงข้อมูลภาพรวมของผู้ใช้ 20
PATCH /users/ 20 and PUT /users/20 - อัปเดตผู้ใช้ 20
DELETE /users/20 - ลบผู้ใช้ 20
OPTIONS /users - แสดงคำกริยาที่รองรับเกี่ยวกับ endpoint / users
OPTIONS /users/20 - แสดงคำกริยาที่รองรับเกี่ยวกับ endpoint / users / 20
สังเกตว่า Yii ตั้งชื่อคอนโทรลเลอร์แบบพหูพจน์โดยอัตโนมัติ
Step 3 - ตอนนี้เปิดบุรุษไปรษณีย์เจาะเข้าไป http://localhost:8080/usersแล้วคลิก "ส่ง" คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/open_postman.jpg)
Step 4 - หากต้องการสร้างผู้ใช้ใหม่ให้เปลี่ยนประเภทคำขอเป็น POST เพิ่มพารามิเตอร์เนื้อหา 2 ตัว ได้แก่ ชื่อและอีเมลแล้วคลิก "ส่ง"
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_new_user.jpg)
Step 5 - คุณสามารถใช้ไฟล์ fieldsพารามิเตอร์เพื่อระบุฟิลด์ที่ควรรวมไว้ในผลลัพธ์ ตัวอย่างเช่น URLhttp://localhost:8080/users?fields=idชื่อจะส่งคืนเฉพาะไฟล์ id และ name ตามที่แสดงในภาพหน้าจอต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/use_fields.jpg)
โดยการลบล้าง fields() and extraFields()วิธีการคุณสามารถกำหนดข้อมูลที่สามารถใส่ลงในการตอบสนองได้ ความแตกต่างระหว่างสองวิธีนี้คือก่อนหน้านี้กำหนดชุดฟิลด์เริ่มต้นซึ่งควรรวมไว้ในการตอบสนองในขณะที่วิธีหลังกำหนดฟิลด์เพิ่มเติมซึ่งอาจรวมอยู่ในการตอบกลับหากผู้ใช้ปลายทางร้องขอผ่านทางexpand พารามิเตอร์การสืบค้น
Step 1 - แก้ไขไฟล์ MyUser โมเดลด้วยวิธีนี้
<?php
namespace app\models;
use app\components\UppercaseBehavior;
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 { public function fields() { return [ 'id', 'name', //PHP callback 'datetime' => function($model) {
return date("d:m:Y H:i:s");
}
];
}
/**
* @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',
];
}
}
?>
นอกเหนือจากฟิลด์เริ่มต้น: id และชื่อเราได้เพิ่มฟิลด์ที่กำหนดเอง - datetime.
Step 2 - ในบุรุษไปรษณีย์ให้เรียกใช้ URL http://localhost:8080/users.
![](https://post.nghiatu.com/assets/tutorial/yii/images/run_url.jpg)
Step 3 - ตอนนี้แก้ไขไฟล์ MyUser โมเดลด้วยวิธีนี้
<?php
namespace app\models;
use app\components\UppercaseBehavior;
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 {
public function fields() {
return [
'id',
'name',
];
}
public function extraFields() {
return ['email'];
}
/**
* @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',
];
}
}
?>
โปรดสังเกตว่าฟิลด์อีเมลจะถูกส่งกลับโดยไฟล์ extraFields() วิธี.
Step 4 - หากต้องการรับข้อมูลด้วยฟิลด์นี้ให้เรียกใช้ http://localhost:8080/users?expand=email.
![](https://post.nghiatu.com/assets/tutorial/yii/images/get_data.jpg)
การปรับแต่งการดำเนินการ
yii\rest\ActiveController คลาสให้การดำเนินการต่อไปนี้ -
Index - แสดงรายการทรัพยากรทีละหน้า
View - ส่งกลับรายละเอียดของทรัพยากรที่ระบุ
Create - สร้างทรัพยากรใหม่
Update - อัปเดตทรัพยากรที่มีอยู่
Delete - ลบทรัพยากรที่ระบุ
Options - ส่งคืนวิธีการ HTTP ที่รองรับ
การดำเนินการทั้งหมดข้างต้นได้รับการประกาศในวิธีการดำเนินการ ()
หากต้องการปิดใช้งานการดำเนินการ "ลบ" และ "สร้าง" ให้แก้ไขไฟล์ UserController วิธีนี้ -
<?php
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController {
public $modelClass = 'app\models\MyUser';
public function actions() {
$actions = parent::actions(); // disable the "delete" and "create" actions unset($actions['delete'], $actions['create']); return $actions;
}
}
?>
การจัดการข้อผิดพลาด
เมื่อได้รับคำขอ RESTful API หากมีข้อผิดพลาดในคำขอหรือมีสิ่งที่ไม่คาดคิดเกิดขึ้นบนเซิร์ฟเวอร์คุณสามารถโยนข้อยกเว้นได้ หากคุณสามารถระบุสาเหตุของข้อผิดพลาดได้คุณควรใส่ข้อยกเว้นพร้อมกับรหัสสถานะ HTTP ที่เหมาะสม Yii REST ใช้สถานะต่อไปนี้ -
200 - ตกลง
201- สร้างทรัพยากรสำเร็จตามคำขอ POST ส่วนหัวตำแหน่งประกอบด้วย URL ที่ชี้ไปยังทรัพยากรที่สร้างขึ้นใหม่
204 - คำขอได้รับการจัดการเรียบร้อยแล้วและการตอบกลับไม่มีเนื้อหา
304 - ไม่ได้แก้ไขทรัพยากร
400 - คำขอไม่ถูกต้อง
401 - การรับรองความถูกต้องล้มเหลว
403 - ผู้ใช้ที่พิสูจน์ตัวตนไม่ได้รับอนุญาตให้เข้าถึงปลายทาง API ที่ระบุ
404 - ไม่มีทรัพยากร
405 - ไม่อนุญาตวิธีการ
415 - ประเภทสื่อที่ไม่รองรับ
422 - การตรวจสอบข้อมูลล้มเหลว
429 - คำขอมากเกินไป
500 - ข้อผิดพลาดภายในเซิร์ฟเวอร์
เมื่อเราเขียนคลาส PHP เราจะทำการดีบักทีละขั้นตอนหรือใช้คำสั่ง die หรือ echo เพื่อตรวจสอบว่ามันทำงานอย่างไร หากเราพัฒนาเว็บแอปพลิเคชันเรากำลังป้อนข้อมูลการทดสอบในแบบฟอร์มเพื่อให้แน่ใจว่าเพจทำงานตามที่เราคาดไว้ กระบวนการทดสอบนี้สามารถทำได้โดยอัตโนมัติ
แนวทางการทดสอบอัตโนมัติเหมาะสมสำหรับโครงการระยะยาวซึ่ง ได้แก่ -
- ซับซ้อนและมีขนาดใหญ่
- เติบโตอย่างต่อเนื่อง
- แพงเกินไปในแง่ของต้นทุนของความล้มเหลว
หากโครงการของคุณไม่ซับซ้อนและค่อนข้างเรียบง่ายหรือเป็นเพียงโครงการครั้งเดียวการทดสอบอัตโนมัติอาจเป็นเรื่องที่ยุ่งยากเกินไป
การเตรียมการสำหรับการทดสอบ
Step 1- ติดตั้งกรอบ Codeception เรียกใช้รหัสต่อไปนี้
composer global require "codeception/codeception = 2.0.*"
composer global require "codeception/specify = *"
composer global require "codeception/verify = *"
Step 2 - เรียกใช้สิ่งต่อไปนี้
composer global status
ผลลัพธ์คือ“ เปลี่ยนไดเร็กทอรีปัจจุบันเป็น <directory>” คุณควรเพิ่ม '<directory> / vendor / bin' ในตัวแปร PATH ของคุณ ในกรณีนี้ให้เรียกใช้รหัสต่อไปนี้ -
export PATH = $PATH:~/.composer/vendor/bin
Step 3 - สร้างฐานข้อมูลใหม่ที่เรียกว่า 'yii2_basic_tests'.
Step 4 - ภายในไดเร็กทอรีการทดสอบทำงาน
codeception/bin/yii migrate
สามารถดูการกำหนดค่าฐานข้อมูลได้ที่ tests/codeception/config/config.php.
Step 5 - สร้างชุดทดสอบผ่าน.
codecept build
การแข่งขัน
จุดประสงค์หลักของการติดตั้งคือการตั้งค่าสภาพแวดล้อมในสถานะที่ไม่รู้จักเพื่อให้การทดสอบของคุณดำเนินไปในทางที่คาดหวัง Yii จัดเตรียมเฟรมเวิร์กใกล้ฟิกซ์เจอร์ แนวคิดหลักของกรอบการติดตั้ง Yii คือวัตถุติดตั้ง แสดงถึงลักษณะเฉพาะของสภาพแวดล้อมการทดสอบ วัตถุติดตั้งเป็นตัวอย่างของไฟล์yii\test\Fixture class.
ในการกำหนดฟิกซ์เจอร์คุณควรสร้างคลาสใหม่และขยายจาก yii \ test \ Fixture หรือ yii \ test \ ActiveFixture รุ่นก่อนดีกว่าสำหรับการติดตั้งเอนกประสงค์ในขณะที่รุ่นหลังได้รับการออกแบบมาโดยเฉพาะเพื่อทำงานกับฐานข้อมูลและ ActiveRecord
การทดสอบหน่วย
การทดสอบหน่วยช่วยให้คุณทดสอบฟังก์ชันแต่ละฟังก์ชัน ตัวอย่างเช่นฟังก์ชันโมเดลหรือคลาสส่วนประกอบ
Step 1 - สร้างฟิกซ์เจอร์ใหม่ในไฟล์ชื่อ ExampleFixture.php ภายใต้ tests/codeception/fixtures ไดเรกทอรี
<?php
namespace app\tests\codeception\fixtures;
use yii\test\ActiveFixture;
class ExampleFixture extends ActiveFixture {
public $modelClass = ‘app⊨’MyUser';
}
?>
Step 2 - จากนั้นสร้างไฟล์ทดสอบใหม่ชื่อ ExampleTest.php ในโฟลเดอร์ testing / codeception / unit / models
<?php
namespace tests\codeception\unit\models;
use app\models\MyUser;
use yii\codeception\TestCase;
class ExampleTest extends TestCase {
public function testCreateMyUser() {
$m = new MyUser(); $m->name = "myuser";
$m->email = "[email protected]"; $this->assertTrue($m->save()); } public function testUpdateMyUser() { $m = new MyUser();
$m->name = "myuser2"; $m->email = "[email protected]";
$this->assertTrue($m->save());
$this->assertEquals("myuser2", $m->name);
}
public function testDeleteMyUser() {
$m = MyUser::findOne(['name' => 'myuser2']); $this->assertNotNull($m); MyUser::deleteAll(['name' => $m->name]);
$m = MyUser::findOne(['name' => 'myuser2']); $this->assertNull($m);
}
}
?>
ในโค้ดด้านบนเรากำหนดการทดสอบสามแบบ -
- testCreateMyUser,
- testUpdateMyUser และ
- testDeleteMyUser.
เราเพิ่งสร้างผู้ใช้ใหม่อัปเดตชื่อของเขาและพยายามลบเขา เราจัดการไฟล์MyUser โมเดลในแง่ของฐานข้อมูล yii2_basic_tests ซึ่งเป็นสำเนาฐานข้อมูลจริงของเรา
Step 3 - ในการเริ่มต้นไฟล์ testsย้ายไปที่โฟลเดอร์การทดสอบและเรียกใช้
codecept run unit models/ExampleTest
ควรผ่านการทดสอบทั้งหมด คุณจะเห็นสิ่งต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/unit_tests.jpg)
การทดสอบการทำงาน
การทดสอบการทำงานช่วยคุณใน -
- ทดสอบแอปพลิเคชันโดยใช้โปรแกรมจำลองเบราว์เซอร์
- ตรวจสอบว่าฟังก์ชันทำงานอย่างถูกต้อง
- โต้ตอบกับฐานข้อมูล
- ส่งข้อมูลไปยังสคริปต์ฝั่งเซิร์ฟเวอร์
ภายในโฟลเดอร์การทดสอบทำงาน -
generate:cept functional AboutPageCept
คำสั่งดังกล่าวสร้างไฟล์ AboutPageCept.phpภายใต้โฟลเดอร์การทดสอบ / codeception / functional ในการทดสอบการทำงานนี้เราจะตรวจสอบว่าไฟล์about มีเพจอยู่
Step 1 - แก้ไขไฟล์ AboutPageCept.php ไฟล์.
<?php
$I = new FunctionalTester($scenario); $I->wantTo('perform actions and see result');
$I->amOnPage('site/about'); $I->see('about');
$I->dontSee('apple');
?>
ในรหัสที่ระบุข้างต้นเราตรวจสอบว่าเราอยู่ในหน้าเกี่ยวกับหรือไม่ เห็นได้ชัดว่าเราควรเห็นคำว่า 'about' และ no 'apple' ในหน้านั้น
Step 2 - เรียกใช้การทดสอบผ่าน.
run functional AboutPageCept
คุณจะเห็นผลลัพธ์ต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/run_unit_tests.jpg)
การแคชเป็นวิธีที่มีประสิทธิภาพในการปรับปรุงประสิทธิภาพของแอปพลิเคชันของคุณ กลไกการแคชจะจัดเก็บข้อมูลแบบคงที่ในแคชและรับจากแคชเมื่อได้รับการร้องขอ ในฝั่งเซิร์ฟเวอร์คุณอาจใช้แคชเพื่อจัดเก็บข้อมูลพื้นฐานเช่นรายการข่าวล่าสุด คุณยังสามารถจัดเก็บส่วนย่อยของหน้าหรือทั้งหน้าเว็บ ในฝั่งไคลเอ็นต์คุณสามารถใช้การแคช HTTP เพื่อเก็บหน้าที่เยี่ยมชมล่าสุดไว้ในแคชของเบราว์เซอร์
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในเทอร์มินัลให้รันmysql -u root –p
.สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"], ["User2", "[email protected]"], ["User3", "[email protected]"], ["User4", "[email protected]"], ["User5", "[email protected]"], ["User6", "[email protected]"], ["User7", "[email protected]"], ["User8", "[email protected]"], ["User9", "[email protected]"], ["User10", "[email protected]"], ["User11", "[email protected]"], ]); } public function safeDown() { $this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
แคชข้อมูล
การแคชข้อมูลช่วยคุณในการจัดเก็บตัวแปร PHP ในแคชและเรียกคืนในภายหลัง การแคชข้อมูลอาศัยส่วนประกอบของแคชซึ่งโดยปกติจะลงทะเบียนเป็นส่วนประกอบของแอปพลิเคชัน หากต้องการเข้าถึงส่วนประกอบของแอปพลิเคชันคุณสามารถโทรYii::$app → cache. คุณสามารถลงทะเบียนส่วนประกอบแอปพลิเคชันแคชได้หลายรายการ
Yii รองรับการจัดเก็บแคชต่อไปนี้ -
yii \ caching \ DbCache - ใช้ตารางฐานข้อมูลเพื่อจัดเก็บข้อมูลแคช คุณต้องสร้างตารางตามที่ระบุใน yii \ caching \ DbCache :: $ cacheTable
yii \ caching \ ApcCache - ใช้นามสกุล PHP APC
yii \ caching \ FileCache - ใช้ไฟล์เพื่อจัดเก็บข้อมูลแคช
yii \ caching \ DummyCache - ทำหน้าที่เป็นตัวยึดแคชซึ่งไม่มีการแคชจริง จุดประสงค์ของส่วนประกอบนี้คือเพื่อลดความซับซ้อนของโค้ดที่ต้องการตรวจสอบความพร้อมใช้งานของแคช
yii \ caching \ MemCache - ใช้นามสกุล PHP memcache
yii \ caching \ WinCache - ใช้นามสกุล PHP WinCache
yii \ redis \ Cache - ใช้ส่วนประกอบแคชตามฐานข้อมูล Redis
yii \ caching \ XCache - ใช้นามสกุล PHP XCache
ส่วนประกอบแคชทั้งหมดรองรับ API ต่อไปนี้ -
get () - ดึงค่าข้อมูลจากแคชด้วยคีย์ที่ระบุ ค่าเท็จจะถูกส่งกลับหากค่าข้อมูลหมดอายุ / ไม่ถูกต้องหรือไม่พบ
add () - เก็บค่าข้อมูลที่ระบุโดยคีย์ในแคชหากไม่พบคีย์ในแคช
set () - เก็บค่าข้อมูลที่ระบุโดยคีย์ในแคช
multiGet () - ดึงข้อมูลหลายค่าจากแคชด้วยคีย์ที่ระบุ
multiAdd () - เก็บค่าข้อมูลหลายค่าในแคช แต่ละรายการจะถูกระบุโดยคีย์ หากมีคีย์อยู่แล้วในแคชค่าข้อมูลจะถูกข้ามไป
multiSet () - เก็บค่าข้อมูลหลายค่าในแคช แต่ละรายการจะถูกระบุโดยคีย์
มีอยู่ () - ส่งคืนค่าที่ระบุว่าพบคีย์ที่ระบุในแคชหรือไม่
flush () - ลบค่าข้อมูลทั้งหมดออกจากแคช
ลบ () - ลบค่าข้อมูลที่คีย์ระบุออกจากแคช
ค่าข้อมูลที่จัดเก็บในแคชจะยังคงอยู่ที่นั่นตลอดไปเว้นแต่จะถูกลบออก หากต้องการเปลี่ยนลักษณะการทำงานนี้คุณสามารถตั้งค่าพารามิเตอร์การหมดอายุเมื่อเรียกใช้เมธอด set () เพื่อเก็บค่าข้อมูล
ค่าข้อมูลที่แคชไว้อาจไม่ถูกต้องโดยการเปลี่ยนแปลงของ cache dependencies -
yii \ caching \ DbDependency - การอ้างอิงจะเปลี่ยนไปหากผลการสืบค้นของคำสั่ง SQL ที่ระบุมีการเปลี่ยนแปลง
yii \ caching \ ChainedDependency - การพึ่งพาจะเปลี่ยนไปหากการอ้างอิงใด ๆ บนห่วงโซ่มีการเปลี่ยนแปลง
yii \ caching \ FileDependency - การอ้างอิงจะเปลี่ยนไปหากเวลาแก้ไขล่าสุดของไฟล์มีการเปลี่ยนแปลง
yii \ caching \ ExpressionDependency - การอ้างอิงจะเปลี่ยนไปหากผลลัพธ์ของนิพจน์ PHP ที่ระบุมีการเปลี่ยนแปลง
ตอนนี้เพิ่มไฟล์ cache ส่วนประกอบของแอปพลิเคชันกับแอปพลิเคชันของคุณ
Step 1 - แก้ไขไฟล์ config/web.php ไฟล์.
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
?>
Step 2 - เพิ่มฟังก์ชันใหม่ที่เรียกว่า actionTestCache() ไปยัง SiteController
public function actionTestCache() {
$cache = Yii::$app->cache;
// try retrieving $data from cache $data = $cache->get("my_cached_data"); if ($data === false) {
// $data is not found in cache, calculate it from scratch $data = date("d.m.Y H:i:s");
// store $data in cache so that it can be retrieved next time $cache->set("my_cached_data", $data, 30); } // $data is available here
var_dump($data);
}
Step 3 - ประเภท http://localhost:8080/index.php?r=site/test-cache ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/test_cache.jpg)
Step 4- หากคุณโหลดหน้านี้ซ้ำคุณควรสังเกตว่าวันที่ไม่มีการเปลี่ยนแปลง ค่าวันที่ถูกแคชและแคชจะหมดอายุภายใน 30 วินาที โหลดหน้านี้ซ้ำหลังจาก 30 วินาที
![](https://post.nghiatu.com/assets/tutorial/yii/images/date_value_cached.jpg)
การแคชแบบสอบถาม
การแคชแบบสอบถามช่วยให้คุณสามารถแคชผลลัพธ์ของการสืบค้นฐานข้อมูล การแคชการสืบค้นจำเป็นต้องมีการเชื่อมต่อฐานข้อมูลและส่วนประกอบแอปพลิเคชันแคช
Step 1 - เพิ่มวิธีการใหม่ที่เรียกว่า actionQueryCaching() ไปยัง SiteController
public function actionQueryCaching() {
$duration = 10;
$result = MyUser::getDb()->cache(function ($db) {
return MyUser::find()->count();
}, $duration); var_dump($result);
$user = new MyUser(); $user->name = "cached user name";
$user->email = "[email protected]"; $user->save();
echo "==========";
var_dump(MyUser::find()->count());
}
ในโค้ดด้านบนเราแคชแบบสอบถามฐานข้อมูลเพิ่มผู้ใช้ใหม่และแสดงจำนวนผู้ใช้
Step 2 - ไปที่ URL http://localhost:8080/index.php?r=site/query-caching และโหลดหน้านี้ซ้ำ
![](https://post.nghiatu.com/assets/tutorial/yii/images/query_caching.jpg)
เมื่อเราเปิดหน้าสำหรับหน้าแรกเราจะแคชแบบสอบถาม DB และแสดงจำนวนผู้ใช้ทั้งหมด เมื่อเราโหลดเพจใหม่ผลลัพธ์ของคิวรี DB ที่แคชจะเหมือนเดิมเนื่องจากคิวรีฐานข้อมูลถูกแคช
คุณสามารถล้างแคชจากคอนโซลโดยใช้คำสั่งต่อไปนี้ -
yii cache - แสดงส่วนประกอบแคชที่มีอยู่
yii cache/flush cache1 cache2 cache3 - ล้างส่วนประกอบแคช cache1, cache2 และ cache3
yii cache/flush-all - ล้างส่วนประกอบแคชทั้งหมด
Step 3 - ภายในรูทโปรเจ็กต์ของแอปพลิเคชันของคุณทำงาน ./yii cache/flush-all.
![](https://post.nghiatu.com/assets/tutorial/yii/images/running_project_root_application.jpg)
การแคชแฟรกเมนต์จัดเตรียมแคชส่วนย่อยของหน้าเว็บ
Step 1 - เพิ่มฟังก์ชันใหม่ที่เรียกว่า actionFragmentCaching() ไปยัง SiteController
public function actionFragmentCaching() {
$user = new MyUser(); $user->name = "cached user name";
$user->email = "[email protected]"; $user->save();
$models = MyUser::find()->all(); return $this->render('cachedview', ['models' => $models]);
}
ในโค้ดด้านบนเราได้สร้างผู้ใช้ใหม่และแสดงไฟล์ cachedview ดูข้อมูล.
Step 2 - ตอนนี้สร้างไฟล์ใหม่ชื่อ cachedview.php ใน views/site โฟลเดอร์
<?php if ($this->beginCache('cachedview')) { ?>
<?php foreach ($models as $model): ?>
<?= $model->id; ?> <?= $model->name; ?>
<?= $model->email; ?> <br/> <?php endforeach; ?> <?php $this->endCache(); } ?>
<?php echo "Count:", \app\models\MyUser::find()->count(); ?>
เราได้รวมตรรกะการสร้างเนื้อหาไว้ในคู่ของวิธี startCache () และ endCache () หากพบเนื้อหาในแคชเมธอด startCache () จะแสดงผล
Step 3 - ไปที่ URL http://localhost:8080/index.php?r=site/fragment-cachingและโหลดหน้านี้ซ้ำ ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/fragment_caching.jpg)
สังเกตว่าเนื้อหาระหว่างเมธอด startCache () และ endCache () ถูกแคชไว้ ในฐานข้อมูลเรามีผู้ใช้ 13 คน แต่แสดงเพียง 12 คน
การแคชหน้า
การแคชเพจให้แคชเนื้อหาของเว็บเพจทั้งหมด รองรับการแคชเพจโดยyii\filter\PageCache.
Step 1 - แก้ไขไฟล์ behaviors() ฟังก์ชันของ SiteController
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60
],
];
}
โค้ดด้านบนจะแคชหน้าดัชนีเป็นเวลา 60 วินาที
Step 2 - ไปที่ URL http://localhost:8080/index.php?r=site/index. จากนั้นแก้ไขข้อความแสดงความยินดีของไฟล์มุมมองดัชนี หากคุณโหลดหน้านี้ซ้ำคุณจะไม่สังเกตเห็นการเปลี่ยนแปลงใด ๆ เนื่องจากเพจถูกแคชไว้ รอสักครู่แล้วโหลดหน้านี้ใหม่อีกครั้ง
![](https://post.nghiatu.com/assets/tutorial/yii/images/page_caching.jpg)
การแคช HTTP
แอปพลิเคชันบนเว็บยังสามารถใช้การแคชฝั่งไคลเอ็นต์ ในการใช้งานคุณสามารถกำหนดค่าไฟล์yii\filter\HttpCache กรองสำหรับการกระทำของคอนโทรลเลอร์
Last-Modified header ใช้การประทับเวลาเพื่อระบุว่ามีการแก้ไขเพจหรือไม่
Step 1 - ในการเปิดใช้งานการส่งส่วนหัว Last-Modified ให้กำหนดค่าคุณสมบัติ yii \ filter \ HttpCache :: $ lastModified
public function behaviors() {
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) { $q = new \yii\db\Query();
return $q->from('news')->max('created_at');
},
],
];
}
ในโค้ดด้านบนเราเปิดใช้งานการแคช HTTP สำหรับหน้าดัชนีเท่านั้น เมื่อเบราว์เซอร์เปิดเพจดัชนีเป็นครั้งแรกเพจจะถูกสร้างขึ้นที่ฝั่งเซิร์ฟเวอร์และส่งไปยังเบราว์เซอร์ ครั้งที่สองหากไม่มีการสร้างข่าวเซิร์ฟเวอร์จะไม่สร้างเพจขึ้นมาใหม่
ส่วนหัว Etag มีแฮชที่แสดงเนื้อหาของเพจ หากหน้าเปลี่ยนแฮชก็จะเปลี่ยนตามไปด้วย
Step 2 - หากต้องการเปิดใช้งานการส่งส่วนหัว Etag ให้กำหนดค่าไฟล์ yii\filters\HttpCache::$etagSeed ทรัพย์สิน.
public function behaviors() {
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'etagSeed' => function ($action, $params) {
$user = $this->findModel(\Yii::$app->request->get('id')); return serialize([$user->name, $user->email]);
},
],
];
}
ในโค้ดด้านบนเราเปิดใช้งานการแคช HTTP สำหรับไฟล์ indexการกระทำเท่านั้น ควรสร้างส่วนหัว Etag HTTP ตามชื่อและอีเมลของผู้ใช้ เมื่อเบราว์เซอร์เปิดเพจดัชนีเป็นครั้งแรกเพจจะถูกสร้างขึ้นที่ฝั่งเซิร์ฟเวอร์และส่งไปยังเบราว์เซอร์ ครั้งที่สองหากไม่มีการเปลี่ยนแปลงชื่อหรืออีเมลเซิร์ฟเวอร์จะไม่สร้างเพจขึ้นมาใหม่
นามแฝงช่วยให้คุณไม่ต้องฮาร์ดโค้ดพา ธ หรือ URL ที่แน่นอนในโครงการของคุณ นามแฝงเริ่มต้นด้วยอักขระ @
ในการกำหนดนามแฝงคุณควรเรียกไฟล์ Yii::setAlias() วิธีการ -
// an alias of a file path
Yii::setAlias('@alias', '/path/to/alias');
// an alias of a URL
Yii::setAlias('@urlAlias', 'http://www.google.com');
คุณยังสามารถได้รับนามแฝงใหม่จากนามแฝงที่มีอยู่ -
Yii::setAlias('@pathToSomewhere', '@alias/path/to/somewhere');
คุณสามารถเรียกใช้เมธอด Yii :: setAlias () ในสคริปต์รายการหรือในคุณสมบัติที่เขียนได้ที่เรียกว่านามแฝงในการกำหนดค่าแอปพลิเคชัน -
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'aliases' => [
'@alias' => '/path/to/somewhere',
'@urlAlias' => 'http://www.google.com',
],
//other components...
]
]
ในการแก้ไขนามแฝงคุณควรเรียกใช้เมธอด Yii :: getAlias ()
Yii กำหนดนามแฝงต่อไปนี้ไว้ล่วงหน้า -
@app - เส้นทางพื้นฐานของแอปพลิเคชัน
@yii - โฟลเดอร์ที่เป็นที่ตั้งของไฟล์ BaseYii.php
@webroot - ไดเรกทอรีรากของเว็บของแอปพลิเคชัน
@web - URL พื้นฐานของแอปพลิเคชัน
@runtime- เส้นทางรันไทม์ของแอปพลิเคชัน ค่าเริ่มต้นเป็น @ app / runtime
@vendor- ไดเรกทอรีผู้ขายนักแต่งเพลง ค่าเริ่มต้นเป็น @ app / vendor
@npm- ไดเรกทอรีรากสำหรับแพ็คเกจ npm ค่าเริ่มต้นเป็น @ vendor / npm
@bower- ไดเรกทอรีรากสำหรับแพ็คเกจ bower ค่าเริ่มต้นเป็น @ vendor / bower
ตอนนี้เพิ่มฟังก์ชันใหม่ที่เรียกว่าactionAliases ()ไปยัง SiteController -
public function actionAliases() {
Yii::setAlias("@components", "@app/components");
Yii::setAlias("@imagesUrl", "@web/images");
var_dump(Yii::getAlias("@components"));
var_dump(Yii::getAlias("@imagesUrl"));
}
ในโค้ดด้านบนเราได้สร้างนามแฝง 2 ชื่อ: @components สำหรับส่วนประกอบของแอปพลิเคชันและ @imagesUrl สำหรับ URL ที่เราเก็บภาพแอปพลิเคชันทั้งหมด
พิมพ์ http: // localhost: 8080 / index.php? r = site / aliases คุณจะเห็นผลลัพธ์ต่อไปนี้ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/site_aliases.jpg)
Yii นำเสนอเฟรมเวิร์กที่ปรับแต่งได้สูงและขยายได้ ด้วยความช่วยเหลือของกรอบนี้คุณสามารถบันทึกข้อความประเภทต่างๆได้อย่างง่ายดาย
ในการบันทึกข้อความคุณควรเรียกใช้วิธีใดวิธีหนึ่งต่อไปนี้:
Yii::error() - บันทึกข้อความแสดงข้อผิดพลาดร้ายแรง
Yii::warning() - บันทึกข้อความเตือน
Yii::info() - บันทึกข้อความพร้อมข้อมูลที่เป็นประโยชน์
Yii::trace() - บันทึกข้อความเพื่อติดตามการทำงานของโค้ด
วิธีการข้างต้นบันทึกข้อความบันทึกในหมวดหมู่ต่างๆ พวกเขาแบ่งปันลายเซ็นฟังก์ชันต่อไปนี้ -
function ($message, $category = 'application')
ที่ไหน -
$message - ข้อความบันทึกที่จะบันทึก
$category - หมวดหมู่ของข้อความบันทึก
วิธีการตั้งชื่อที่ง่ายและสะดวกคือการใช้ค่าคงที่เวทย์มนตร์ PHP __METHOD__ ตัวอย่างเช่น -
Yii::info('this is a log message', __METHOD__);
ล็อกเป้าหมายคืออินสแตนซ์ของคลาส yii \ log \ Target จะกรองข้อความบันทึกทั้งหมดตามหมวดหมู่และส่งออกไปยังไฟล์ฐานข้อมูลและ / หรืออีเมล
Step 1 - คุณสามารถลงทะเบียนเป้าหมายบันทึกหลายรายการได้เช่นกัน
return [
// the "log" component is loaded during bootstrapping time
'bootstrap' => ['log'],
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning', 'trace', 'info'],
],
[
'class' => 'yii\log\EmailTarget',
'levels' => ['error', 'warning'],
'categories' => ['yii\db\*'],
'message' => [
'from' => ['[email protected]'],
'to' => ['[email protected]', '[email protected]'],
'subject' => 'Application errors at mydomain.com',
],
],
],
],
],
];
ในโค้ดด้านบนมีการลงทะเบียนเป้าหมายสองรายการ เป้าหมายแรกจะเลือกข้อผิดพลาดคำเตือนการติดตามและข้อความข้อมูลทั้งหมดและบันทึกไว้ในฐานข้อมูล เป้าหมายที่สองส่งข้อความแสดงข้อผิดพลาดและคำเตือนทั้งหมดไปยังอีเมลของผู้ดูแลระบบ
Yii มีล็อกเป้าหมายในตัวดังต่อไปนี้ -
yii\log\DbTarget - เก็บข้อความบันทึกในฐานข้อมูล
yii\log\FileTarget - บันทึกข้อความบันทึกในไฟล์
yii\log\EmailTarget - ส่งข้อความบันทึกไปยังที่อยู่อีเมลที่กำหนดไว้ล่วงหน้า
yii\log\SyslogTarget - บันทึกข้อความบันทึกลงใน syslog โดยเรียกใช้ฟังก์ชัน PHP syslog ()
ตามค่าเริ่มต้นข้อความบันทึกจะมีรูปแบบดังนี้ -
Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text
Step 2 - ในการปรับแต่งรูปแบบนี้คุณควรกำหนดค่าไฟล์ yii\log\Target::$prefixทรัพย์สิน. ตัวอย่างเช่น.
[
'class' => 'yii\log\FileTarget',
'prefix' => function ($message) {
$user = Yii::$app->has('user', true) ? Yii::$app->get('user') : 'undefined user'; $userID = $user ? $user->getId(false) : 'anonym';
return "[$userID]";
}
]
ข้อมูลโค้ดด้านบนกำหนดค่าเป้าหมายบันทึกเพื่อนำหน้าข้อความบันทึกทั้งหมดด้วย ID ผู้ใช้ปัจจุบัน
ตามค่าเริ่มต้นข้อความบันทึกจะรวมค่าจากตัวแปร PHP ทั่วโลกเหล่านี้: $ _GET, $_POST, $_SESSION, $_COOKIE, $_FILES และ $ _SERVER หากต้องการแก้ไขลักษณะการทำงานนี้คุณควรกำหนดค่าไฟล์yii\log\Target::$logVars คุณสมบัติที่มีชื่อของตัวแปรที่คุณต้องการรวม
ข้อความบันทึกทั้งหมดจะถูกเก็บรักษาไว้ในอาร์เรย์โดยอ็อบเจ็กต์คนตัดไม้ วัตถุคนตัดไม้จะล้างข้อความที่บันทึกไปยังเป้าหมายบันทึกทุกครั้งที่อาร์เรย์รวบรวมข้อความจำนวนหนึ่ง (ค่าเริ่มต้นคือ 1,000)
Step 3 - ในการปรับแต่งหมายเลขนี้คุณควรโทรไปที่ไฟล์ flushInterval property.
return [
'bootstrap' => ['log'],
'components' => [
'log' => [
'flushInterval' => 50, // default is 1000
'targets' => [...],
],
],
];
แม้ว่าอ็อบเจ็กต์คนตัดไม้จะล้างข้อความบันทึกไปยังเป้าหมายที่บันทึกไว้ แต่ก็ไม่ได้รับการส่งออกทันที การส่งออกเกิดขึ้นเมื่อเป้าหมายของบันทึกรวบรวมข้อความจำนวนหนึ่ง (ค่าเริ่มต้นคือ 1,000)
Step 4 - ในการปรับแต่งหมายเลขนี้คุณควรกำหนดค่า exportInterval ทรัพย์สิน.
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 50, // default is 1000
]
Step 5 - ตอนนี้แก้ไขไฟล์ config/web.php ยื่นด้วยวิธีนี้
<?php
$params = require(__DIR__ . '/params.php'); $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'flushInterval' => 1,
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'logVars' => []
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
?>
ในโค้ดด้านบนเรากำหนดส่วนประกอบแอปพลิเคชันบันทึกตั้งค่า flushInterval และ exportIntevalเป็น 1 เพื่อให้ข้อความบันทึกทั้งหมดปรากฏในไฟล์บันทึกทันที นอกจากนี้เรายังละเว้นคุณสมบัติระดับของเป้าหมายบันทึก หมายความว่าข้อความบันทึกของทุกหมวดหมู่ (ข้อผิดพลาดคำเตือนข้อมูลการติดตาม) จะปรากฏในไฟล์บันทึก
Step 6 - จากนั้นสร้างฟังก์ชันที่เรียกว่า actionLog () ใน SiteController
public function actionLog() {
Yii::trace('trace log message');
Yii::info('info log message');
Yii::warning('warning log message');
Yii::error('error log message');
}
ในโค้ดด้านบนเราเพียงแค่เขียนข้อความบันทึกสี่หมวดหมู่ที่แตกต่างกันลงในไฟล์บันทึก
Step 7 - พิมพ์ URL http://localhost:8080/index.php?r=site/logในแถบที่อยู่ของเว็บเบราว์เซอร์ ข้อความบันทึกควรปรากฏภายใต้ไดเร็กทอรี app / runtime / logs ในไฟล์ app.log
![](https://post.nghiatu.com/assets/tutorial/yii/images/actionlog_function.jpg)
Yii มีตัวจัดการข้อผิดพลาดในตัว ตัวจัดการข้อผิดพลาด Yii ทำสิ่งต่อไปนี้ -
- แปลงข้อผิดพลาด PHP ที่ไม่ร้ายแรงทั้งหมดให้เป็นข้อยกเว้นที่ตรวจจับได้
- แสดงข้อผิดพลาดและข้อยกเว้นทั้งหมดด้วย call stack โดยละเอียด
- รองรับรูปแบบข้อผิดพลาดต่างๆ
- รองรับการใช้คอนโทรลเลอร์เพื่อแสดงข้อผิดพลาด
หากต้องการปิดใช้งานตัวจัดการข้อผิดพลาดคุณควรกำหนดค่าคงที่ YII_ENABLE_ERROR_HANDLER ให้เป็นเท็จในสคริปต์รายการ ตัวจัดการข้อผิดพลาดถูกลงทะเบียนเป็นส่วนประกอบของแอปพลิเคชัน
Step 1 - คุณสามารถกำหนดค่าได้ด้วยวิธีต่อไปนี้
return [
'components' => [
'errorHandler' => [
'maxSourceLines' => 10,
],
],
];
การกำหนดค่าข้างต้นกำหนดจำนวนบรรทัดซอร์สโค้ดที่จะแสดงเป็น 10 ตัวจัดการข้อผิดพลาดจะแปลงข้อผิดพลาด PHP ที่ไม่ร้ายแรงทั้งหมดให้เป็นข้อยกเว้นที่ตรวจจับได้
Step 2 - เพิ่มฟังก์ชันใหม่ที่เรียกว่า actionShowError() ไปยัง SiteController
public function actionShowError() {
try {
5/0;
} catch (ErrorException $e) {
Yii::warning("Ooops...division by zero.");
}
// execution continues...
}
Step 3 - ไปที่ URL http://localhost:8080/index.php?r=site/show-error. คุณจะเห็นข้อความเตือน
![](https://post.nghiatu.com/assets/tutorial/yii/images/add_actionshowerror_method.jpg)
หากคุณต้องการแสดงให้ผู้ใช้เห็นว่าคำขอของเขาไม่ถูกต้องคุณสามารถโยนไฟล์ yii\web\NotFoundHttpException.
Step 4 - แก้ไขไฟล์ actionShowError() ฟังก์ชัน
public function actionShowError() {
throw new NotFoundHttpException("Something unexpected happened");
}
Step 5 - พิมพ์ที่อยู่ http://localhost:8080/index.php?r=site/show-errorในแถบที่อยู่ คุณจะเห็นข้อผิดพลาด HTTP ต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/modify_actionshowerror_method.jpg)
เมื่อค่าคงที่ YII_DEBUG เป็นจริงตัวจัดการข้อผิดพลาดจะแสดงข้อผิดพลาดพร้อมกับ call stack โดยละเอียด เมื่อค่าคงที่เป็นเท็จข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นเท่านั้น โดยค่าเริ่มต้นตัวจัดการข้อผิดพลาดจะแสดงข้อผิดพลาดโดยใช้มุมมองเหล่านี้ -
@yii/views/errorHandler/exception.php - ไฟล์มุมมองถูกใช้เมื่อข้อผิดพลาดควรถูกแสดงพร้อมข้อมูล call stack
@yii/views/errorHandler/error.php - ไฟล์มุมมองถูกใช้เมื่อข้อผิดพลาดควรแสดงโดยไม่มีข้อมูล call stack
คุณสามารถใช้การดำเนินการกับข้อผิดพลาดเฉพาะเพื่อปรับแต่งการแสดงข้อผิดพลาด
Step 6 - แก้ไขไฟล์ errorHandler ส่วนประกอบแอปพลิเคชันในไฟล์ config/web.php ไฟล์.
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [ 'errorAction' => 'site/error', ],
//other components...
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
การกำหนดค่าข้างต้นกำหนดว่าเมื่อข้อผิดพลาดต้องแสดงโดยไม่มี call stack ไฟล์ site/error การดำเนินการจะถูกดำเนินการ
Step 7 - แก้ไขไฟล์ actions() วิธีการของ SiteController
public function actions() {
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
รหัสข้างต้นกำหนดว่าเมื่อไฟล์ error เกิดขึ้นมุมมองข้อผิดพลาดจะถูกแสดงผล
Step 8 - สร้างไฟล์ชื่อ error.php ภายใต้ไดเร็กทอรี views / site
<?php
/* @var $this yii\web\View */
/* @var $name string */ /* @var $message string */
/* @var $exception Exception */ use yii\helpers\Html; $this->title = $name; ?> <div class = "site-error"> <h2>customized error</h2> <h1><?= Html::encode($this->title) ?></h1>
<div class = "alert alert-danger">
<?= nl2br(Html::encode($message)) ?>
</div>
<p>
The above error occurred while the Web server was processing your request.
</p>
<p>
Please contact us if you think this is a server error. Thank you.
</p>
</div>
Step 9 - ไปที่ที่อยู่ http://localhost:8080/index.php?r=site/show-errorคุณจะเห็นมุมมองข้อผิดพลาดที่กำหนดเอง
![](https://post.nghiatu.com/assets/tutorial/yii/images/error_page.jpg)
กระบวนการยืนยันตัวตนของผู้ใช้เรียกว่า authentication. โดยปกติจะใช้ชื่อผู้ใช้และรหัสผ่านเพื่อตัดสินว่าผู้ใช้เป็นคนที่เขาอ้างว่าเป็นหรือไม่
ในการใช้กรอบการตรวจสอบสิทธิ์ Yii คุณต้อง -
- กำหนดค่าคอมโพเนนต์แอปพลิเคชันผู้ใช้
- ใช้อินเทอร์เฟซ yii \ web \ IdentityInterface
เทมเพลตแอปพลิเคชันพื้นฐานมาพร้อมกับระบบตรวจสอบสิทธิ์ในตัว ใช้ส่วนประกอบแอปพลิเคชันผู้ใช้ดังที่แสดงในรหัสต่อไปนี้ -
<?php
$params = require(__DIR__ . '/params.php');
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this //is required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], //other components... 'db' => require(__DIR__ . '/db.php'), ], 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
ในการกำหนดค่าข้างต้นคลาสเอกลักษณ์สำหรับผู้ใช้ถูกกำหนดค่าให้เป็น app \ models \ User
คลาสเอกลักษณ์ต้องใช้ yii\web\IdentityInterface ด้วยวิธีการดังต่อไปนี้ -
findIdentity() - ค้นหาอินสแตนซ์ของคลาสเอกลักษณ์โดยใช้ ID ผู้ใช้ที่ระบุ
findIdentityByAccessToken() - ค้นหาอินสแตนซ์ของคลาสเอกลักษณ์โดยใช้โทเค็นการเข้าถึงที่ระบุ
getId() - ส่งคืน ID ของผู้ใช้
getAuthKey() - ส่งคืนคีย์ที่ใช้ในการตรวจสอบการเข้าสู่ระบบโดยใช้คุกกี้
validateAuthKey() - ใช้ตรรกะในการตรวจสอบรหัสเข้าสู่ระบบที่ใช้คุกกี้
โมเดลผู้ใช้จากเทมเพลตแอปพลิเคชันพื้นฐานใช้ฟังก์ชันข้างต้นทั้งหมด ข้อมูลผู้ใช้จะถูกเก็บไว้ในไฟล์$users คุณสมบัติ -
<?php
namespace app\models;
class User extends \yii\base\Object implements \yii\web\IdentityInterface {
public $id; public $username;
public $password; public $authKey;
public $accessToken; private static $users = [
'100' => [
'id' => '100',
'username' => 'admin',
'password' => 'admin',
'authKey' => 'test100key',
'accessToken' => '100-token',
],
'101' => [
'id' => '101',
'username' => 'demo',
'password' => 'demo',
'authKey' => 'test101key',
'accessToken' => '101-token',
],
];
/**
* @inheritdoc
*/
public static function findIdentity($id) { return isset(self::$users[$id]) ? new static(self::$users[$id]) : null; } /** * @inheritdoc */ public static function findIdentityByAccessToken($token, $type = null) { foreach (self::$users as $user) { if ($user['accessToken'] === $token) { return new static($user);
}
}
return null;
}
/**
* Finds user by username
*
* @param string $username * @return static|null */ public static function findByUsername($username) {
foreach (self::$users as $user) {
if (strcasecmp($user['username'], $username) === 0) {
return new static($user); } } return null; } /** * @inheritdoc */ public function getId() { return $this->id;
}
/**
* @inheritdoc
*/
public function getAuthKey() {
return $this->authKey; } /** * @inheritdoc */ public function validateAuthKey($authKey) {
return $this->authKey === $authKey;
}
/**
* Validates password
*
* @param string $password password to validate * @return boolean if password provided is valid for current user */ public function validatePassword($password) {
return $this->password === $password;
}
}
?>
Step 1 - ไปที่ URL http://localhost:8080/index.php?r=site/login และเข้าสู่เว็บไซต์โดยใช้ผู้ดูแลระบบเพื่อเข้าสู่ระบบและรหัสผ่าน
![](https://post.nghiatu.com/assets/tutorial/yii/images/admin_login.jpg)
Step 2 - จากนั้นเพิ่มฟังก์ชันใหม่ที่เรียกว่า actionAuth() ไปยัง SiteController
public function actionAuth(){
// the current user identity. Null if the user is not authenticated.
$identity = Yii::$app->user->identity;
var_dump($identity); // the ID of the current user. Null if the user not authenticated. $id = Yii::$app->user->id; var_dump($id);
// whether the current user is a guest (not authenticated)
$isGuest = Yii::$app->user->isGuest;
var_dump($isGuest);
}
Step 3 - พิมพ์ที่อยู่ http://localhost:8080/index.php?r=site/auth ในเว็บเบราว์เซอร์คุณจะเห็นข้อมูลโดยละเอียดเกี่ยวกับ admin ผู้ใช้
![](https://post.nghiatu.com/assets/tutorial/yii/images/actionauth_method.jpg)
Step 4 - ในการเข้าสู่ระบบและเข้าสู่ระบบผู้ใช้คุณสามารถใช้รหัสต่อไปนี้
public function actionAuth() {
// whether the current user is a guest (not authenticated)
var_dump(Yii::$app->user->isGuest);
// find a user identity with the specified username.
// note that you may want to check the password if needed
$identity = User::findByUsername("admin"); // logs in the user Yii::$app->user->login($identity); // whether the current user is a guest (not authenticated) var_dump(Yii::$app->user->isGuest);
Yii::$app->user->logout(); // whether the current user is a guest (not authenticated) var_dump(Yii::$app->user->isGuest);
}
ในตอนแรกเราตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่หากค่ากลับมา falseจากนั้นเราเข้าสู่ระบบผู้ใช้ผ่านไฟล์ Yii::$app → user → login() โทรและนำเขาออกโดยใช้ไฟล์ Yii::$app → user → logout() วิธี.
Step 5 - ไปที่ URL http://localhost:8080/index.php?r=site/authคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/verifying_user_login.jpg)
yii\web\User class ทำให้เกิดเหตุการณ์ต่อไปนี้ -
EVENT_BEFORE_LOGIN- ขึ้นที่จุดเริ่มต้นของyii \ web \ User :: login ()
EVENT_AFTER_LOGIN - เพิ่มขึ้นหลังจากเข้าสู่ระบบสำเร็จ
EVENT_BEFORE_LOGOUT- ขึ้นที่จุดเริ่มต้นของyii \ web \ User :: logout ()
EVENT_AFTER_LOGOUT - เพิ่มขึ้นหลังจากออกจากระบบสำเร็จ
กระบวนการตรวจสอบว่าผู้ใช้มีสิทธิ์เพียงพอที่จะทำบางสิ่งเรียกว่า authorization. Yii มี ACF (Access Control Filter) ซึ่งเป็นวิธีการอนุญาตที่ใช้เป็นไฟล์yii\filters\AccessControl. ปรับเปลี่ยนพฤติกรรม () ฟังก์ชั่นของ SiteController -
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['about', 'contact'],
'rules' => [
[
'allow' => true,
'actions' => ['about'],
'roles' => ['?'],
],
[
'allow' => true,
'actions' => ['contact', 'about'],
'roles' => ['@'],
],
],
],
];
}
ในรหัสข้างต้น ACF ถูกแนบมาเป็นพฤติกรรม คุณสมบัติเดียวระบุว่าควรใช้ ACF กับการดำเนินการเกี่ยวกับและการติดต่อเท่านั้น การดำเนินการอื่น ๆ ทั้งหมดไม่อยู่ภายใต้การควบคุมการเข้าถึง คุณสมบัติกฎแสดงรายการกฎการเข้าถึง แขกทุกคน (ที่มีบทบาท“?”) จะได้รับอนุญาตให้เข้าถึงไฟล์aboutหนังบู๊. ผู้ใช้ที่ได้รับการรับรองความถูกต้องทั้งหมด (ที่มีบทบาท“ @”) จะได้รับอนุญาตให้เข้าถึงผู้ติดต่อและเกี่ยวกับการดำเนินการ
หากคุณไปที่ URL http://localhost:8080/index.php?r=site/aboutคุณจะเห็นหน้านี้ แต่ถ้าคุณเปิด URL http://localhost:8080/index.php?r=site/contactคุณจะถูกเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบเนื่องจากมีเพียงผู้ใช้ที่ได้รับการรับรองความถูกต้องเท่านั้นที่สามารถเข้าถึงไฟล์ contact หนังบู๊.
กฎการเข้าถึงรองรับตัวเลือกมากมาย -
allow - กำหนดว่านี่คือกฎ "อนุญาต" หรือ "ปฏิเสธ"
actions - กำหนดว่าการกระทำใดตรงกับกฎนี้
controllers - กำหนดตัวควบคุมที่ตรงกับกฎนี้
roles- กำหนดบทบาทของผู้ใช้ที่ตรงกับกฎนี้ ได้รับการยอมรับสองบทบาทพิเศษ -
? - ตรงกับผู้ใช้ทั่วไป
@ - จับคู่ผู้ใช้ที่ได้รับการรับรองความถูกต้อง
ips - กำหนดที่อยู่ IP ที่ตรงกับกฎนี้
verbs - กำหนดวิธีการร้องขอ (POST, GET, PUT ฯลฯ ) ที่ตรงกับกฎนี้
matchCallback - กำหนดฟังก์ชันเรียกใช้ PHP ที่ควรเรียกใช้เพื่อตรวจสอบว่าควรใช้กฎนี้หรือไม่
denyCallback - กำหนดฟังก์ชันเรียกใช้ PHP ที่ควรเรียกใช้เมื่อกฎนี้ปฏิเสธการเข้าถึง
รหัสผ่าน
Step 1 - Yii มีวิธีการที่สะดวกต่อไปนี้สำหรับการทำงานกับรหัสผ่าน
public function actionAuth() {
$password = "asd%#G3"; //generates password hasg $hash = Yii::$app->getSecurity()->generatePasswordHash($password);
var_dump($hash); //validates password hash if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
echo "correct password";
} else {
echo "incorrect password";
}
//generate a token
$key = Yii::$app->getSecurity()->generateRandomString();
var_dump($key); //encrypt data with a secret key $encryptedData = Yii::$app->getSecurity()->encryptByPassword("mydata", $key);
var_dump($encryptedData); //decrypt data with a secret key $data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $key); var_dump($data);
//hash data with a secret key
$data = Yii::$app->getSecurity()->hashData("mygenuinedata", $key); var_dump($data);
//validate data with a secret key
$data = Yii::$app->getSecurity()->validateData($data, $key);
var_dump($data);
}
Step 2 - ป้อน URL http://localhost:8080/index.php?r=site/authคุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/passwords.jpg)
I18N (Internationalization)เป็นขั้นตอนการออกแบบแอปพลิเคชันที่สามารถปรับให้เข้ากับภาษาต่างๆ Yii นำเสนอคุณสมบัติ I18N แบบครบวงจร
โลแคลคือชุดของพารามิเตอร์ที่ระบุภาษาและประเทศของผู้ใช้ ตัวอย่างเช่น en-US ย่อมาจากภาษาอังกฤษและสหรัฐอเมริกา Yii มีภาษาสองประเภท: ภาษาต้นทางและภาษาเป้าหมาย ภาษาต้นทางคือภาษาที่ใช้เขียนข้อความทั้งหมดในแอปพลิเคชัน ภาษาเป้าหมายคือภาษาที่ควรใช้เพื่อแสดงเนื้อหาแก่ผู้ใช้ปลายทาง
คอมโพเนนต์การแปลข้อความจะแปลข้อความจากภาษาต้นทางเป็นภาษาเป้าหมาย ในการแปลข้อความบริการแปลข้อความจะต้องค้นหาในแหล่งที่มาของข้อความ
ในการใช้บริการแปลข้อความคุณควร -
- ตัดข้อความที่คุณต้องการแปลด้วยวิธี Yii :: t ()
- กำหนดค่าแหล่งที่มาของข้อความ
- จัดเก็บข้อความในแหล่งที่มาของข้อความ
Step 1 - วิธีการ Yii :: t () สามารถใช้ได้เช่นนี้
echo \Yii::t('app', 'This is a message to translate!');
ในข้อมูลโค้ดด้านบน "แอป" หมายถึงหมวดหมู่ข้อความ
Step 2 - ตอนนี้แก้ไขไฟล์ config/web.php ไฟล์.
<?php
$params = require(__DIR__ . '/params.php');
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this //is required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'i18n' => [ 'translations' => [ 'app*' => [ 'class' => 'yii\i18n\PhpMessageSource', 'fileMap' => [ 'app' => 'app.php' ], ], ], ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'flushInterval' => 1, 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'exportInterval' => 1, 'logVars' => [], ], ], ], 'db' => require(__DIR__ . '/db.php'), ], // set target language to be Russian 'language' => 'ru-RU', // set source language to be English 'sourceLanguage' => 'en-US', 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
ในโค้ดด้านบนเรากำหนดแหล่งที่มาและภาษาเป้าหมาย นอกจากนี้เรายังระบุแหล่งที่มาของข้อความที่สนับสนุนโดยyii\i18n\PhpMessageSource. รูปแบบแอพ * ระบุว่าหมวดหมู่ข้อความทั้งหมดที่ขึ้นต้นด้วยแอพต้องได้รับการแปลโดยใช้แหล่งที่มาของข้อความนี้ ในการกำหนดค่าข้างต้นคำแปลภาษารัสเซียทั้งหมดจะอยู่ในไฟล์ข้อความ / ru-RU / app.php
Step 3- ตอนนี้สร้างโครงสร้างไดเร็กทอรีข้อความ / ru-RU ภายในโฟลเดอร์ ru-RU สร้างไฟล์ชื่อ app.php สิ่งนี้จะจัดเก็บคำแปล EN → RU ทั้งหมด
<?php
return [
'This is a string to translate!' => 'Эта строка для перевода!'
];
?>
Step 4 - สร้างฟังก์ชันที่เรียกว่า actionTranslation () ใน SiteController
public function actionTranslation() {
echo \Yii::t('app', 'This is a string to translate!');
}
Step 5 - ป้อน URL http://localhost:8080/index.php?r=site/translation ในเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
![](https://post.nghiatu.com/assets/tutorial/yii/images/translation.jpg)
ข้อความถูกแปลเป็นภาษารัสเซียเมื่อเราตั้งค่าภาษาเป้าหมายเป็น ru-RU เราสามารถเปลี่ยนภาษาของแอปพลิเคชันได้แบบไดนามิก
Step 6 - แก้ไขไฟล์ actionTranslation() วิธี.
public function actionTranslation() {
\Yii::$app->language = 'en-US';
echo \Yii::t('app', 'This is a string to translate!');
}
ตอนนี้ข้อความจะแสดงเป็นภาษาอังกฤษ -
![](https://post.nghiatu.com/assets/tutorial/yii/images/action_translation_method.jpg)
Step 7 - ในข้อความที่แปลคุณสามารถแทรกพารามิเตอร์หนึ่งหรือหลายตัวได้
public function actionTranslation() {
$username = 'Vladimir'; // display a translated message with username being "Vladimir" echo \Yii::t('app', 'Hello, {username}!', [ 'username' => $username,
]), "<br>";
$username = 'John'; // display a translated message with username being "John" echo \Yii::t('app', 'Hello, {username}!', [ 'username' => $username,
]), "<br>";
$price = 150; $count = 3;
$subtotal = 450; echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
}
ต่อไปนี้จะเป็นผลลัพธ์
![](https://post.nghiatu.com/assets/tutorial/yii/images/translated_message.jpg)
คุณสามารถแปลสคริปต์มุมมองทั้งหมดแทนการแปลข้อความแต่ละข้อความ ตัวอย่างเช่นหากภาษาเป้าหมายคือ ru-RU และคุณต้องการแปลไฟล์มุมมอง views / site / index.php คุณควรแปลมุมมองและบันทึกไว้ในไดเร็กทอรี views / site / ru-RU
Step 8- สร้างโครงสร้างไดเร็กทอรี views / site / ru-RU จากนั้นภายในโฟลเดอร์ ru-RU ให้สร้างไฟล์ชื่อ index.php ด้วยรหัสต่อไปนี้
<?php
/* @var $this yii\web\View */ $this->title = 'My Yii Application';
?>
<div class = "site-index">
<div class = "jumbotron">
<h1>Добро пожаловать!</h1>
</div>
</div>
Step 9 - ภาษาเป้าหมายคือ ru-RU ดังนั้นหากคุณป้อน URL http://localhost:8080/index.php?r=site/indexคุณจะเห็นหน้าพร้อมคำแปลภาษารัสเซีย
![](https://post.nghiatu.com/assets/tutorial/yii/images/russian_translation.jpg)
Gii เป็นส่วนขยายที่ให้ตัวสร้างโค้ดบนเว็บสำหรับการสร้างโมเดลฟอร์มโมดูล CRUD และอื่น ๆ
โดยค่าเริ่มต้นเครื่องกำเนิดไฟฟ้าต่อไปนี้จะพร้อมใช้งาน -
Model Generator - สร้างคลาส ActiveRecord สำหรับตารางฐานข้อมูลที่ระบุ
CRUD Generator - สร้างคอนโทรลเลอร์และมุมมองที่ใช้การดำเนินการ CRUD (สร้างอ่านอัปเดตลบ) สำหรับโมเดลที่ระบุ
Controller Generator - สร้างคลาสคอนโทรลเลอร์ใหม่ด้วยการกระทำของคอนโทรลเลอร์หนึ่งหรือหลายตัวและมุมมองที่สอดคล้องกัน
Form Generator - สร้างไฟล์สคริปต์มุมมองที่แสดงฟอร์มเพื่อรวบรวมอินพุตสำหรับคลาสโมเดลที่ระบุ
Module Generator - สร้างรหัสโครงกระดูกที่ต้องการโดยโมดูล Yii
Extension Generator - สร้างไฟล์ที่ต้องการโดยส่วนขยาย Yii
ในการเปิดเครื่องมือสร้าง gii ให้พิมพ์ http://localhost:8080/index.php?r=gii: ในแถบที่อยู่ของเว็บเบราว์เซอร์
![](https://post.nghiatu.com/assets/tutorial/yii/images/generation_tool.jpg)
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้ -
ในเทอร์มินัลให้รันmysql -u root –p
สร้างฐานข้อมูลใหม่ผ่าน CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?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", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
![](https://post.nghiatu.com/assets/tutorial/yii/images/create_model.jpg)
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
ในการสร้างแบบจำลองใน Gii -
<?php
namespace app\models;
use app\components\UppercaseBehavior;
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 {
/**
* @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',
];
}
}
?>
กำลังสร้าง CRUD
ให้เราสร้าง CRUD สำหรับโมเดล MyUser
Step 1 - เปิดอินเทอร์เฟซเครื่องกำเนิด CRUD กรอกแบบฟอร์ม
![](https://post.nghiatu.com/assets/tutorial/yii/images/crud_generator_interface.jpg)
Step 2- จากนั้นคลิกปุ่ม "ดูตัวอย่าง" และ "สร้าง" ไปที่ URLhttp://localhost:8080/index.php?r=my-userคุณจะเห็นรายชื่อผู้ใช้ทั้งหมด
![](https://post.nghiatu.com/assets/tutorial/yii/images/click_preview_button.jpg)
Step 3 - เปิด URL http://localhost:8080/index.php?r=my-user/create. คุณควรเห็นผู้ใช้สร้างแบบฟอร์ม
![](https://post.nghiatu.com/assets/tutorial/yii/images/user_create_form.jpg)
ให้เราดูวิธีสร้างคอนโทรลเลอร์
Step 1 - ในการสร้างตัวควบคุมที่มีการดำเนินการหลายอย่างให้เปิดอินเทอร์เฟซตัวสร้างคอนโทรลเลอร์โดยกรอกแบบฟอร์ม
![](https://post.nghiatu.com/assets/tutorial/yii/images/generate_controller.jpg)
Step 2- จากนั้นคลิกปุ่ม "ดูตัวอย่าง" และ "สร้าง" CustomController.php ไฟล์ที่มีดัชนีสวัสดีและการกระทำของโลกจะถูกสร้างขึ้นในโฟลเดอร์คอนโทรลเลอร์
<?php
namespace app\controllers;
class CustomController extends \yii\web\Controller {
public function actionHello() {
return $this->render('hello'); } public function actionIndex() { return $this->render('index');
}
public function actionWorld() {
return $this->render('world');
}
}
?>
การสร้างแบบฟอร์ม
Step 1 - ในการสร้างไฟล์มุมมองจากโมเดลที่มีอยู่ให้เปิดอินเทอร์เฟซการสร้างแบบฟอร์มและกรอกแบบฟอร์ม
![](https://post.nghiatu.com/assets/tutorial/yii/images/form_generation.jpg)
จากนั้นคลิกปุ่ม "ดูตัวอย่าง" และ "สร้าง" ไฟล์มุมมองแบบกำหนดเองจะถูกสร้างขึ้นในโฟลเดอร์มุมมอง
Step 2 - หากต้องการแสดงให้เพิ่มวิธีการใหม่ในไฟล์ CustomController.
public function actionView() {
$model = new MyUser();
return $this->render('/customview', [ 'model' => $model,
]);
}
Step 3 - หากต้องการดูไฟล์มุมมองที่สร้างขึ้นให้เปิด URL http://localhost:8080/index.php?r=custom/view.
![](https://post.nghiatu.com/assets/tutorial/yii/images/generated_view_file.jpg)
ให้เราดูวิธีสร้างโมดูล
Step 1 - ในการสร้างโมดูลให้เปิดอินเทอร์เฟซการสร้างโมดูลและกรอกแบบฟอร์ม
![](https://post.nghiatu.com/assets/tutorial/yii/images/module_generator.jpg)
Step 2 - จากนั้นคลิกปุ่ม "ดูตัวอย่าง" และ "สร้าง"
Step 3- เราจำเป็นต้องเปิดใช้งานโมดูล แก้ไขไฟล์modules ส่วนประกอบแอปพลิเคชันในไฟล์ config/web.php ไฟล์.
'modules' => [
'admin' => [
'class' => 'app\modules\admin\Module',
],
],
Step 4 - หากต้องการตรวจสอบว่าโมดูลที่สร้างขึ้นใหม่ของเราทำงานหรือไม่ให้พิมพ์ UR http://localhost:8080/index.php?r=admin/default/index ในเว็บเบราว์เซอร์
![](https://post.nghiatu.com/assets/tutorial/yii/images/generated_module_works.jpg)