มุมมอง
Webman ใช้ไวยากรณ์ PHP ดั้งเดิมเป็นเทมเพลตตามค่าเริ่มต้น ซึ่งให้ประสิทธิภาพที่ดีที่สุดเมื่อเปิดใช้งาน opcache
นอกเหนือจากเทมเพลต PHP ดั้งเดิมแล้ว Webman ยังให้บริการเทมเพลตเอนจิน Twig、 Blade、 think-template ด้วย
เปิดใช้งาน opcache
เมื่อใช้งานมุมมอง แนะนำให้เปิดใช้งานตัวเลือก opcache.enable
และ opcache.enable_cli
ใน php.ini เพื่อให้เทมเพลตเอนจินแสดงประสิทธิภาพที่ดีที่สุด
ติดตั้ง Twig
- ติดตั้งผ่าน composer
composer require twig/twig
- แก้ไขการตั้งค่าใน
config/view.php
เป็น<?php use support\view\Twig;
return [
'handler' => Twig::class
];
> **คำแนะนำ**
> ตัวเลือกการตั้งค่าอื่น ๆ สามารถส่งผ่าน options เช่น
```php
return [
'handler' => Twig::class,
'options' => [
'debug' => false,
'charset' => 'utf-8'
]
];
ติดตั้ง Blade
- ติดตั้งผ่าน composer
composer require psr/container ^1.1.1 webman/blade
- แก้ไขการตั้งค่าใน
config/view.php
เป็น<?php use support\view\Blade;
return [
'handler' => Blade::class
];
## ติดตั้ง think-template
1. ติดตั้งผ่าน composer
`composer require topthink/think-template`
2. แก้ไขการตั้งค่าใน `config/view.php` เป็น
```php
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
];
คำแนะนำ
ตัวเลือกการตั้งค่าอื่น ๆ สามารถส่งผ่าน options เช่น
return [
'handler' => ThinkPHP::class,
'options' => [
'view_suffix' => 'html',
'tpl_begin' => '{',
'tpl_end' => '}'
]
];
ตัวอย่างเทมเพลต PHP ดั้งเดิม
สร้างไฟล์ app/controller/UserController.php
ดังนี้
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
สร้างไฟล์ใหม่ app/view/user/hello.html
ดังนี้
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
ตัวอย่างเทมเพลต Twig
แก้ไขการตั้งค่าใน config/view.php
เป็น
<?php
use support\view\Twig;
return [
'handler' => Twig::class
];
ไฟล์ app/controller/UserController.php
ดังนี้
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
ไฟล์ app/view/user/hello.html
ดังนี้
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>
เอกสารเพิ่มเติมดูที่ Twig
ตัวอย่างของเทมเพลต Blade
แก้ไขการตั้งค่าใน config/view.php
เป็น
<?php
use support\view\Blade;
return [
'handler' => Blade::class
];
ไฟล์ app/controller/UserController.php
ดังนี้
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
ไฟล์ app/view/user/hello.blade.php
ดังนี้
หมายเหตุ นามสกุลของเทมเพลต Blade คือ
.blade.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>
เอกสารเพิ่มเติมดูที่ Blade
ตัวอย่างของเทมเพลต ThinkPHP
แก้ไขการตั้งค่าใน config/view.php
เป็น
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class
];
ไฟล์ app/controller/UserController.php
ดังนี้
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
ไฟล์ app/view/user/hello.html
ดังนี้
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>
เอกสารเพิ่มเติมดูที่ think-template
การมอบหมายค่าให้กับเทมเพลต
นอกจากการใช้ view(เทมเพลต, อาร์เรย์ตัวแปร)
เพื่อมอบหมายค่าให้กับเทมเพลต เรายังสามารถมอบหมายค่าให้กับเทมเพลตในตำแหน่งใด ๆ โดยการเรียก View::assign()
ตัวอย่างเช่น:
<?php
namespace app\controller;
use support\Request;
use support\View;
class UserController
{
public function hello(Request $request)
{
View::assign([
'name1' => 'value1',
'name2'=> 'value2',
]);
View::assign('name3', 'value3');
return view('user/test', ['name' => 'webman']);
}
}
View::assign()
มีประโยชน์ในบางสถานการณ์ เช่น เมื่อระบบต้องแสดงข้อมูลผู้ใช้ที่ล็อกอินในส่วนหัวของแต่ละหน้า ถ้าทุกหน้าใช้การมอบหมายข้อมูลนี้ผ่าน view('เทมเพลต', ['user_info' => 'ข้อมูลผู้ใช้']);
จะค่อนข้างยุ่งยาก วิธีแก้คือใน middleware สามารถดึงข้อมูลผู้ใช้ จากนั้นใช้ View::assign()
เพื่อมอบหมายข้อมูลผู้ใช้ให้กับเทมเพลต
เกี่ยวกับเส้นทางไฟล์มุมมอง
คอนโทรลเลอร์
เมื่อคอนโทรลเลอร์เรียก view('ชื่อเทมเพลต',[]);
ไฟล์มุมมองจะค้นหาตามกฎต่อไปนี้:
- ถ้าเริ่มต้นด้วย
/
ให้ใช้เส้นทางนี้เพื่อค้นหาไฟล์มุมมองโดยตรง - ถ้าไม่เริ่มต้นด้วย
/
และไม่ใช่การใช้งานหลายแอป ใช้ไฟล์มุมมองที่เกี่ยวข้องในapp/view/
- ถ้าไม่เริ่มต้นด้วย
/
และเป็นหลายแอป ให้ใช้ไฟล์มุมมองที่เกี่ยวข้องในapp/ชื่อแอป/view/
- ถ้าไม่ส่งพารามิเตอร์เทมเพลต ระบบจะค้นหาไฟล์เทมเพลตตามกฎ 2 และ 3 โดยอัตโนมัติ
ตัวอย่าง:
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
// เท่ากับ return view('user/hello', ['name' => 'webman']);
// เท่ากับ return view('/app/view/user/hello', ['name' => 'webman']);
return view(['name' => 'webman']);
}
}
ฟังก์ชันปิด
ฟังก์ชันปิด $request->app
เป็นค่าว่าง ไม่อยู่ในแอปใด ๆ ดังนั้นฟังก์ชันปิดจึงใช้ไฟล์มุมมองใน app/view/
ตัวอย่างเช่น ในการกำหนดเส้นทางใน config/route.php
Route::any('/admin/user/get', function (Reqeust $reqeust) {
return view('user', []);
});
จะใช้ไฟล์ app/view/user.html
เป็นไฟล์เทมเพลต (เมื่อใช้เทมเพลต Blade ไฟล์เทมเพลตจะเป็น app/view/user.blade.php
)
ระบุแอป
เพื่อให้เทมเพลตสามารถนำกลับมาใช้ใหม่ในโหมดหลายแอป view($template, $data, $app = null)
จะมีพารามิเตอร์ที่สาม $app
เพื่อระบุว่าใช้เทมเพลตจากไดเรกทอรีไหน ตัวอย่าง view('user', [], 'admin');
จะบังคับใช้ไฟล์มุมมองใน app/admin/view/
ข้ามพารามิเตอร์เทมเพลต
ในคอนโทรลเลอร์ของคลาสสามารถข้ามพารามิเตอร์เทมเพลต เช่น
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
// เท่ากับ return view('user/hello', ['name' => 'webman']);
// เท่ากับ return view('/app/view/user/hello', ['name' => 'webman']);
return view(['name' => 'webman']);
}
}
ขยาย Twig
เราสามารถขยายอินสแตนซ์มุมมอง Twig ได้โดยการให้คอลแบ็กการตั้งค่า view.extension
เช่น config/view.php
ดังนี้
<?php
use support\view\Twig;
return [
'handler' => Twig::class,
'extension' => function (\Twig\Environment $twig) {
$twig->addExtension(new your\namespace\YourExtension()); // เพิ่ม Extension
$twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // เพิ่ม Filter
$twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // เพิ่มฟังก์ชัน
}
];
ขยาย Blade
เช่นเดียวกันเราสามารถขยายอินสแตนซ์มุมมอง Blade ได้โดยการให้คอลแบ็กการตั้งค่า view.extension
เช่น config/view.php
ดังนี้
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
// เพิ่มคำสั่งให้กับ blade
$blade->directive('mydate', function ($timestamp) {
return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
});
}
];
การใช้คอมโพเนนต์ใน Blade
สมมติว่าต้องการเพิ่มคอมโพเนนต์ Alert
สร้างไฟล์ใหม่ app/view/components/Alert.php
<?php
namespace app\view\components;
use Illuminate\View\Component;
class Alert extends Component
{
public function __construct()
{
}
public function render()
{
return view('components/alert')->rawBody();
}
}
สร้างไฟล์ใหม่ app/view/components/alert.blade.php
<div>
<b style="color: red">hello blade component</b>
</div>
ไฟล์ /config/view.php
ประกอบด้วยโค้ดแบบดังนี้
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
$blade->component('alert', app\view\components\Alert::class);
}
];
จนมาถึงตอนนี้ คอมโพเนนต์ Alert ของ Blade ได้ตั้งค่าเสร็จสมบูรณ์แล้ว ในเทมเพลตเมื่อใช้งานจะมีลักษณะดังนี้
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
<x-alert/>
</body>
</html>
ขยาย think-template
think-template ใช้ view.options.taglib_pre_load
เพื่อขยายไลบรารีแท็ก เช่น
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
'options' => [
'taglib_pre_load' => your\namspace\Taglib::class,
]
];
รายละเอียดเพิ่มเติมดูที่ think-template แท็กขยาย