Вьюхи

По умолчанию Webman использует нативный синтаксис PHP в качестве шаблона, который демонстрирует наилучшие показатели производительности при включенном opcache. Кроме нативного PHP шаблона, Webman предлагает шаблонные движки Twig, Blade и think-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' => 'информация о пользователе']); на каждой странице, это было бы очень неудобно. Решение - получить информацию о пользователе в промежуточном ПО и затем присвоить ее шаблону через 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 равно 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