Visão

O Webman utiliza por padrão a sintaxe nativa do PHP como template, apresentando o melhor desempenho quando o opcache está ativado. Além do template nativo do PHP, o Webman também oferece os motores de template Twig, Blade e think-template.

Habilitar opcache

Ao utilizar visualizações, recomenda-se fortemente habilitar as opções opcache.enable e opcache.enable_cli no php.ini, para que o motor de template atinja o melhor desempenho.

Instalação do Twig

  1. Instalação via composer

composer require twig/twig

  1. Modifique a configuração config/view.php para
    
    <?php
    use support\view\Twig;

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

> **Dica**
> Outras opções de configuração podem ser passadas através de options, por exemplo  

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

Instalação do Blade

  1. Instalação via composer
composer require psr/container ^1.1.1 webman/blade
  1. Modifique a configuração config/view.php para
    
    <?php
    use support\view\Blade;

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


## Instalação do think-template
1. Instalação via composer

`composer require topthink/think-template`

2. Modifique a configuração `config/view.php` para
```php
<?php
use support\view\ThinkPHP;

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

Dica
Outras opções de configuração podem ser passadas através de options, por exemplo

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

Exemplo de template nativo PHP

Crie o arquivo app/controller/UserController.php como abaixo

<?php
namespace app\controller;

use support\Request;

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

Crie o arquivo app/view/user/hello.html como abaixo

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

Exemplo de motor de template Twig

Modifique a configuração config/view.php para

<?php
use support\view\Twig;

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

app/controller/UserController.php como abaixo

<?php
namespace app\controller;

use support\Request;

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

O arquivo app/view/user/hello.html como abaixo

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

Mais documentação em Twig

Exemplo de template Blade

Modifique a configuração config/view.php para

<?php
use support\view\Blade;

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

app/controller/UserController.php como abaixo

<?php
namespace app\controller;

use support\Request;

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

O arquivo app/view/user/hello.blade.php como abaixo

Atenção, a extensão do template Blade é .blade.php

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

Mais documentação em Blade

Exemplo de template ThinkPHP

Modifique a configuração config/view.php para

<?php
use support\view\ThinkPHP;

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

app/controller/UserController.php como abaixo

<?php
namespace app\controller;

use support\Request;

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

O arquivo app/view/user/hello.html como abaixo

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

Mais documentação em think-template

Atribuição de template

Além de usar view(template, array de variáveis) para atribuir valores ao template, também podemos, em qualquer lugar, usar View::assign() para atribuir valores ao template. Por exemplo:

<?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']);
    }
}

O View::assign() é muito útil em certos cenários, por exemplo, se em um sistema cada página precisa exibir as informações do usuário logado, será muito trabalhoso atribuir essas informações em cada página por meio de view('template', ['user_info' => 'Informações do usuário']);. A solução é obter as informações do usuário no middleware e, em seguida, usar View::assign() para atribuir essas informações ao template.

Sobre o caminho do arquivo de visualização

Controlador

Quando um controlador chama view('nome_do_template',[]);, o arquivo de visualização é buscado de acordo com as seguintes regras:

  1. Se começar com /, o caminho do arquivo de visualização é usado diretamente
  2. Se não começar com / e não for uma aplicação múltipla, o arquivo de visualização correspondente em app/view/ é usado
  3. Se não começar com / e for uma aplicação múltipla, o arquivo de visualização correspondente em app/nome_da_aplicação/view/ é usado
  4. Se o parâmetro do template não for passado, o arquivo de template será automaticamente buscado de acordo com as regras 2 e 3

Exemplo:

<?php
namespace app\controller;

use support\Request;

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

Função anônima

A função anônima $request->app é nula, não pertence a nenhuma aplicação, então a função anônima usa os arquivos de visualização em app/view/, por exemplo, ao definir a rota em config/route.php

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

usará app/view/user.html como arquivo de template (ao usar o template blade, o arquivo de template será app/view/user.blade.php).

Aplicação especificada

Para permitir que os templates sejam reutilizados em um modo de várias aplicações, view($template, $data, $app = null) fornece um terceiro parâmetro $app, que pode ser usado para especificar de qual diretório da aplicação usar o template. Por exemplo, view('user', [], 'admin'); forçará a usar o arquivo de visualização em app/admin/view/.

Parâmetro de template omitido

No controlador de classe, o parâmetro do template pode ser omitido, por exemplo

<?php
namespace app\controller;

use support\Request;

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

Extensão do twig

Podemos estender a instância de visualização do twig, fornecendo um callback em view.extension, por exemplo, config/view.php como abaixo

<?php
use support\view\Twig;
return [
    'handler' => Twig::class,
    'extension' => function (\Twig\Environment $twig) {
        $twig->addExtension(new your\namespace\YourExtension()); // Adiciona uma extensão
        $twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // Adiciona um filtro
        $twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // Adiciona uma função
    }
];

Extensão do blade

Da mesma forma, podemos estender a instância de visualização do blade, fornecendo um callback em view.extension, por exemplo, config/view.php como abaixo

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        // Adiciona diretivas ao blade
        $blade->directive('mydate', function ($timestamp) {
            return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
        });
    }
];

Uso do componente component no blade

Suponha que precisamos adicionar um componente Alert

Crie 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();
    }
}

Crie app/view/components/alert.blade.php

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

/config/view.php semelhante ao código abaixo

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

Com isso, o componente Blade Alert está configurado e ao usá-lo no template será algo como:

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

<x-alert/>

</body>
</html>

Extensão do think-template

O think-template utiliza view.options.taglib_pre_load para estender a biblioteca de tags, por exemplo:

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

Para mais detalhes, consulte Extensão de tags think-template