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, Blade và think-template.
Bật opcache
Khi sử dụng khung nhìn, nên bật hai tùy chọn opcache.enable
và opcache.enable_cli
trong php.ini để công cụ mẫu đạt hiệu suất tốt nhất.
Cài đặt Twig
- Cài đặt composer
composer require twig/twig
- 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
- Cài đặt composer
composer require psr/container ^1.1.1 webman/blade
- 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 quaoptions
, 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:
- Nếu bắt đầu bằng
/
, sẽ sử dụng đường dẫn đó để tìm tệp mẫu - 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 trongapp/view/
- 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 trongapp/应用名/view/
- 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