Представление
По умолчанию 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, например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
-
Установка через composer
composer require topthink/think-template -
Измените конфигурацию
config/view.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.
Пример шаблона на think-template
Измените конфигурацию 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' => 'Информация о пользователе']); на каждой странице будет очень неудобно. Решением будет получить информацию о пользователе в промежуточном обработчике, а затем использовать 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
Обратите внимание
Эта функция требует webman-framework>=1.4.8
Мы можем расширить экземпляр представления 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()); // добавление расширения
$twig->addFilter(new Twig\TwigFilter('rot13', 'str_rot13')); // добавление фильтра
$twig->addFunction(new Twig\TwigFunction('function_name', function () {})); // добавление функции
}
];
Расширение Blade
Примечание
Данная функция требует webman-framework>=1.4.8
Точно так же мы можем расширить экземпляр представления 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
Примечание
Требуется webman/blade>=1.5.2
Предположим, что нужно добавить компонент 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