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.php
para:<?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.php
para:<?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.php
para:<?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 não houver múltiplos aplicativos, utilize os arquivos de visualização em
app/view/
. - Para múltiplos aplicativos, utilize os arquivos de visualização em
app/nome_do_aplicativo/view/
.
Resumindo, se $request->app
estiver vazio, utilize os arquivos de visualização em app/view/
; caso contrário, utilize os arquivos de visualização em app/{$request->app}/view/
.
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/
.
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