Вьюхи
По умолчанию 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' => 'информация о пользователе']);
на каждой странице, это было бы очень неудобно. Решение - получить информацию о пользователе в промежуточном ПО и затем присвоить ее шаблону через 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
равно null
, не принадлежит никакому приложению, поэтому замыкания используют файлы вьюх в 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()); // Добавить расширение
$twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // Добавить фильтр
$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);
}
];
На этом настройка компонента Blade Alert завершена, использование в шаблоне будет следующим
<!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