Visualização
Por padrão, o webman utiliza a sintaxe nativa do PHP como modelo, e, ao abrir o opcache, tem o melhor desempenho. Além do modelo nativo do PHP, o webman também fornece mecanismos de modelo Twig, Blade e think-template.
Habilitando o opcache
Ao usar a visualização, é altamente recomendável habilitar as opções opcache.enable e opcache.enable_cli no arquivo php.ini para garantir o melhor desempenho do mecanismo de modelo.
Instalando o Twig
-
Instalação via composer
composer require twig/twig -
Modifique a configuração em
config/view.phppara:<?php use support\view\Twig; return [ 'handler' => Twig::class ];Dica
Outras opções de configuração podem ser passadas através de opções, por exemplo:return [ 'handler' => Twig::class, 'options' => [ 'debug' => false, 'charset' => 'utf-8' ] ];
Instalando o Blade
-
Instalação via composer
composer require psr/container ^1.1.1 webman/blade -
Modifique a configuração em
config/view.phppara:<?php use support\view\Blade; return [ 'handler' => Blade::class ];
Instalando o think-template
-
Instalação via composer
composer require topthink/think-template -
Modifique a configuração em
config/view.phppara:<?php use support\view\ThinkPHP; return [ 'handler' => ThinkPHP::class, ];Dica
Outras opções de configuração podem ser passadas através de opções, por exemplo:return [ 'handler' => ThinkPHP::class, 'options' => [ 'view_suffix' => 'html', 'tpl_begin' => '{', 'tpl_end' => '}' ] ];
Exemplo de motor de modelo PHP nativo
Crie o arquivo app/controller/UserController.php com o seguinte conteúdo:
<?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 com o seguinte conteúdo:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
Exemplo de motor de modelo Twig
Modifique a configuração em config/view.php para:
<?php
use support\view\Twig;
return [
'handler' => Twig::class
];
app/controller/UserController.php com o seguinte conteúdo:
<?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 com o seguinte conteúdo:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>
Para mais documentação, consulte Twig
Exemplo de motor de modelo Blade
Modifique a configuração em config/view.php para:
<?php
use support\view\Blade;
return [
'handler' => Blade::class
];
app/controller/UserController.php com o seguinte conteúdo:
<?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 com o seguinte conteúdo:
Observe que a extensão do modelo blade é
.blade.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>
Para mais documentação, consulte Blade
Exemplo de motor de modelo ThinkPHP
Modifique a configuração em config/view.php para:
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class
];
app/controller/UserController.php com o seguinte conteúdo:
<?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 com o seguinte conteúdo:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>
Para mais documentação, consulte think-template
Atribuição de modelos
Além de usar view(template, data) para atribuir modelos, também podemos atribuir modelos em qualquer local chamando View::assign(). 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']);
}
}
View::assign() é muito útil em alguns cenários, como em um sistema em que cada página deve exibir informações do usuário conectado. Se todas as páginas tiverem que atribuir estas informações usando view('template', ['user_info' => 'user info']), seria muito trabalhoso. Uma solução seria obter as informações do usuário em um middleware e então atribuí-las ao modelo usando View::assign().
Sobre o caminho do arquivo de visualização
Controladores
Quando os controladores chamam view('template',[]), os arquivos de visualização são pesquisados de acordo com as seguintes regras:
- Se o caminho começar com
/, use esse caminho diretamente para localizar o arquivo de visualização. - Se não começar com
/e não for um aplicativo múltiplo, use o arquivo de visualização correspondente emapp/view/. - Se não começar com
/e for um aplicativo múltiplo, use o arquivo de visualização correspondente emapp/nome_do_aplicativo/view/. - Se nenhum parâmetro de modelo for passado, o arquivo de modelo será localizado automaticamente 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ções de fechamento
Como $request->app está vazio, não pertence a nenhum aplicativo, então as funções de fechamento utilizam os arquivos de visualização em app/view/, por exemplo, a definição de rota em config/route.php:
Route::any('/admin/user/get', function (Reqeust $reqeust) {
return view('user', []);
});
Usará o arquivo app/view/user.html como modelo (quando usando o modelo blade, o arquivo de modelo deve ser app/view/user.blade.php).
Aplicativo especificado
Para reutilizar modelos em modos de aplicativos múltiplos, a função view($template, $data, $app = null) fornece o terceiro parâmetro $app para especificar qual aplicativo utilizar para os arquivos de visualização. Por exemplo, view('user', [], 'admin') utilizará os arquivos de visualização em app/admin/view/.
Omitir o parâmetro de modelo
Nos controladores baseados em classes, você pode omitir o parâmetro de modelo. 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']);
}
}
Estendendo o twig
Nota
Este recurso requer webman-framework >= 1.4.8
Podemos estender a instância de visualização do twig fornecendo o callback view.extension nas configurações. Por exemplo, em config/view.php:
<?php
use support\view\Twig;
return [
'handler' => Twig::class,
'extension' => function (Twig\Environment $twig) {
$twig->addExtension(new your\namespace\YourExtension()); // Adicionar extensão
$twig->addFilter(new Twig\TwigFilter('rot13', 'str_rot13')); // Adicionar filtro
$twig->addFunction(new Twig\TwigFunction('function_name', function () {})); // Adicionar função
}
];
Extensão Blade
Observação
Este recurso requer webman-framework>=1.4.8
Da mesma forma, podemos estender a instância de visualização do Blade fornecendo um retorno de chamada para a configuraçãoview.extension, como no exemplo abaixo emconfig/view.php:
<?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); ?>";
});
}
];
Utilização de componentes blade
Observação
Requer webman/blade>=1.5.2
Suponha que seja necessário adicionar um componente de Alerta.
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 possuirá um código semelhante ao abaixo
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
$blade->component('alert', app\view\components\Alert::class);
}
];
Assim, o componente Alerta do Blade está configurado. O uso no template será semelhante ao seguinte
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
<x-alert/>
</body>
</html>
Extensão think-template
O think-template utiliza view.options.taglib_pre_load para estender bibliotecas 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