มุมมอง

Webman ใช้ไวยากรณ์ PHP ดั้งเดิมเป็นเทมเพลตตามค่าเริ่มต้น ซึ่งให้ประสิทธิภาพที่ดีที่สุดเมื่อเปิดใช้งาน opcache นอกเหนือจากเทมเพลต PHP ดั้งเดิมแล้ว Webman ยังให้บริการเทมเพลตเอนจิน TwigBladethink-template ด้วย

เปิดใช้งาน opcache

เมื่อใช้งานมุมมอง แนะนำให้เปิดใช้งานตัวเลือก opcache.enable และ opcache.enable_cli ใน php.ini เพื่อให้เทมเพลตเอนจินแสดงประสิทธิภาพที่ดีที่สุด

ติดตั้ง Twig

  1. ติดตั้งผ่าน composer

composer require twig/twig

  1. แก้ไขการตั้งค่าใน 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

  1. ติดตั้งผ่าน composer
composer require psr/container ^1.1.1 webman/blade
  1. แก้ไขการตั้งค่าใน 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('ชื่อเทมเพลต',[]); ไฟล์มุมมองจะค้นหาตามกฎต่อไปนี้:

  1. ถ้าเริ่มต้นด้วย / ให้ใช้เส้นทางนี้เพื่อค้นหาไฟล์มุมมองโดยตรง
  2. ถ้าไม่เริ่มต้นด้วย / และไม่ใช่การใช้งานหลายแอป ใช้ไฟล์มุมมองที่เกี่ยวข้องใน app/view/
  3. ถ้าไม่เริ่มต้นด้วย / และเป็นหลายแอป ให้ใช้ไฟล์มุมมองที่เกี่ยวข้องใน app/ชื่อแอป/view/
  4. ถ้าไม่ส่งพารามิเตอร์เทมเพลต ระบบจะค้นหาไฟล์เทมเพลตตามกฎ 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 แท็กขยาย