Khung nhìn

Webman theo mặc định sử dụng cú pháp PHP thuần túy làm mẫu, đem lại hiệu suất tốt nhất khi opcache được bật. Ngoài mẫu PHP thuần túy, Webman còn cung cấp các công cụ mẫu Twig, Bladethink-template.

Bật opcache

Khi sử dụng khung nhìn, nên bật hai tùy chọn opcache.enableopcache.enable_cli trong php.ini để công cụ mẫu đạt hiệu suất tốt nhất.

Cài đặt Twig

  1. Cài đặt composer

composer require twig/twig

  1. Sửa đổi cấu hình config/view.php thành
    
    <?php
    use support\view\Twig;

return [
'handler' => Twig::class
];

> **Mẹo**
> Các tùy chọn cấu hình khác được truyền qua `options`, ví dụ  

```php
return [
    'handler' => Twig::class,
    'options' => [
        'debug' => false,
        'charset' => 'utf-8'
    ]
];

Cài đặt Blade

  1. Cài đặt composer
composer require psr/container ^1.1.1 webman/blade
  1. Sửa đổi cấu hình config/view.php thành
    
    <?php
    use support\view\Blade;

return [
'handler' => Blade::class
];


## Cài đặt think-template
1. Cài đặt composer

`composer require topthink/think-template`

2. Sửa đổi cấu hình `config/view.php` thành
```php
<?php
use support\view\ThinkPHP;

return [
    'handler' => ThinkPHP::class,
];

Mẹo
Các tùy chọn cấu hình khác được truyền qua options, ví dụ

return [
    'handler' => ThinkPHP::class,
    'options' => [
        'view_suffix' => 'html',
        'tpl_begin' => '{',
        'tpl_end' => '}'
    ]
];

Ví dụ về công cụ mẫu PHP thuần túy

Tạo tệp app/controller/UserController.php như sau

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Tạo tệp app/view/user/hello.html như sau

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>

Ví dụ về công cụ mẫu Twig

Sửa đổi cấu hình config/view.php thành

<?php
use support\view\Twig;

return [
    'handler' => Twig::class
];

app/controller/UserController.php như sau

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Tệp app/view/user/hello.html như sau

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>

Tham khảo thêm tài liệu Twig

Ví dụ về mẫu Blade

Sửa đổi cấu hình config/view.php thành

<?php
use support\view\Blade;

return [
    'handler' => Blade::class
];

app/controller/UserController.php như sau

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Tệp app/view/user/hello.blade.php như sau

Lưu ý rằng phần mở rộng mẫu blade là .blade.php

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>

Tham khảo thêm tài liệu Blade

Ví dụ về mẫu ThinkPHP

Sửa đổi cấu hình config/view.php thành

<?php
use support\view\ThinkPHP;

return [
    'handler' => ThinkPHP::class
];

app/controller/UserController.php như sau

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Tệp app/view/user/hello.html như sau

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>

Tham khảo thêm tài liệu think-template

Gán giá trị cho mẫu

Ngoài việc sử dụng view(模版, 变量数组) để gán giá trị cho mẫu, chúng ta còn có thể gán giá trị cho mẫu ở bất kỳ vị trí nào bằng cách gọi View::assign(). Ví dụ:

<?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() rất hữu ích trong một số trường hợp, chẳng hạn như thông tin người dùng hiện tại cần được hiển thị trên đầu mỗi trang của hệ thống; nếu mỗi trang đều gán thông tin này thông qua view('模版', ['user_info' => '用户信息']); sẽ rất phức tạp. Giải pháp là lấy thông tin người dùng trong middleware và gán thông tin người dùng cho mẫu thông qua View::assign().

Về đường dẫn tệp mẫu

Bộ điều khiển

Khi bộ điều khiển gọi view('模版名',[]);, tệp mẫu sẽ được tìm theo các quy tắc sau:

  1. Nếu bắt đầu bằng /, sẽ sử dụng đường dẫn đó để tìm tệp mẫu
  2. Nếu không bắt đầu bằng / và không phải là ứng dụng đa, sẽ sử dụng tệp mẫu tương ứng trong app/view/
  3. Nếu không bắt đầu bằng / và là ứng dụng đa, sẽ sử dụng tệp mẫu tương ứng trong app/应用名/view/
  4. Nếu không truyền tham số mẫu, sẽ tự động tìm tệp mẫu theo quy tắc 2 và 3

Ví dụ:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // tương đương với return view('user/hello', ['name' => 'webman']);
        // tương đương với return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

Hàm đóng

Hàm đóng $request->app là trống, không thuộc về bất kỳ ứng dụng nào, vì vậy hàm đóng sử dụng tệp mẫu trong app/view/, ví dụ như định nghĩa đường dẫn trong config/route.php

Route::any('/admin/user/get', function (Reqeust $reqeust) {
    return view('user', []);
});

sẽ sử dụng app/view/user.html làm tệp mẫu (khi sử dụng mẫu blade, tệp mẫu sẽ là app/view/user.blade.php).

Chỉ định ứng dụng

Để tái sử dụng mẫu trong chế độ đa ứng dụng, view($template, $data, $app = null) cung cấp tham số thứ ba $app, có thể được sử dụng để chỉ định thư mục ứng dụng nào sẽ sử dụng mẫu. Ví dụ view('user', [], 'admin'); sẽ ép buộc sử dụng tệp mẫu trong app/admin/view/.

Bỏ qua tham số mẫu

Trong bộ điều khiển lớp, có thể bỏ qua tham số mẫu, ví dụ

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // tương đương với return view('user/hello', ['name' => 'webman']);
        // tương đương với return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

Mở rộng Twig

Chúng ta có thể mở rộng phiên bản khung nhìn Twig bằng cách cung cấp một callback cho cấu hình view.extension, ví dụ config/view.php như sau

<?php
use support\view\Twig;
return [
    'handler' => Twig::class,
    'extension' => function (\Twig\Environment $twig) {
        $twig->addExtension(new your\namespace\YourExtension()); // Thêm Extension
        $twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // Thêm Filter
        $twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // Thêm hàm
    }
];

Mở rộng Blade

Tương tự, chúng ta có thể mở rộng phiên bản khung nhìn Blade bằng cách cung cấp một callback cho cấu hình view.extension, ví dụ config/view.php như sau

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        // Thêm chỉ thị vào blade
        $blade->directive('mydate', function ($timestamp) {
            return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
        });
    }
];

Sử dụng thành phần component trong Blade

Giả sử cần thêm một thành phần Alert

Tạo 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();
    }
}

Tạo app/view/components/alert.blade.php

<div>
    <b style="color: red">hello blade component</b>
</div>

Cấu hình /config/view.php như sau

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        $blade->component('alert', app\view\components\Alert::class);
    }
];

Tính đến đây, thành phần Blade Alert đã được thiết lập xong, khi sử dụng trong mẫu sẽ tương tự như sau

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>

<x-alert/>

</body>
</html>

Mở rộng think-template

think-template sử dụng view.options.taglib_pre_load để mở rộng thư viện thẻ, ví dụ

<?php
use support\view\ThinkPHP;
return [
    'handler' => ThinkPHP::class,
    'options' => [
        'taglib_pre_load' => your\namspace\Taglib::class,
    ]
];

Chi tiết tham khảo Mở rộng thẻ think-template