Vista
Webman utilizza per impostazione predefinita la sintassi PHP nativa come template, e offre le migliori prestazioni quando opcache
è abilitato. Oltre ai template nativi PHP, Webman fornisce anche i motori di template Twig, Blade e think-template.
Abilitare opcache
Quando si utilizza la vista, si consiglia vivamente di abilitare le opzioni opcache.enable
e opcache.enable_cli
nel file php.ini, affinché il motore di template raggiunga le migliori prestazioni.
Installare Twig
- Installazione tramite composer
composer require twig/twig
- Modificare la configurazione
config/view.php
in modo che sia
<?php
use support\view\Twig;
return [
'handler' => Twig::class
];
Suggerimento
Altre opzioni di configurazione possono essere passate tramite options, ad esempio
return [
'handler' => Twig::class,
'options' => [
'debug' => false,
'charset' => 'utf-8'
]
];
Installare Blade
- Installazione tramite composer
composer require psr/container ^1.1.1 webman/blade
- Modificare la configurazione
config/view.php
in modo che sia
<?php
use support\view\Blade;
return [
'handler' => Blade::class
];
Installare think-template
- Installazione tramite composer
composer require topthink/think-template
- Modificare la configurazione
config/view.php
in modo che sia
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
];
Suggerimento
Altre opzioni di configurazione possono essere passate tramite options, ad esempio
return [
'handler' => ThinkPHP::class,
'options' => [
'view_suffix' => 'html',
'tpl_begin' => '{',
'tpl_end' => '}'
]
];
Esempio di motore di template PHP nativo
Creare il file app/controller/UserController.php
come segue
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Creare il file app/view/user/hello.html
come segue
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
Esempio di motore di template Twig
Modificare la configurazione config/view.php
in modo che sia
<?php
use support\view\Twig;
return [
'handler' => Twig::class
];
app/controller/UserController.php
come segue
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Il file app/view/user/hello.html
sarà
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>
Ulteriori dettagli nel documento Twig
Esempio di template Blade
Modificare la configurazione config/view.php
in modo che sia
<?php
use support\view\Blade;
return [
'handler' => Blade::class
];
app/controller/UserController.php
come segue
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Il file app/view/user/hello.blade.php
sarà
Attenzione: l'estensione del template blade è
.blade.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>
Ulteriori dettagli nel documento Blade
Esempio di template ThinkPHP
Modificare la configurazione config/view.php
in modo che sia
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class
];
app/controller/UserController.php
come segue
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Il file app/view/user/hello.html
sarà
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>
Ulteriori dettagli nel documento think-template
Assegnazione di valori ai template
Oltre a utilizzare view(template, variabile array)
per assegnare valori ai template, possiamo anche assegnare valori ai template in qualsiasi posizione chiamando View::assign()
. Ad esempio:
<?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()
è molto utile in alcune situazioni, ad esempio se un sistema deve visualizzare le informazioni dell'utente attualmente connesso nell'intestazione di ogni pagina, sarebbe molto complicato passare queste informazioni in ogni pagina tramite view('template', ['user_info' => 'informazioni utente']);
. La soluzione è ottenere le informazioni dell'utente nel middleware e quindi assegnarle al template tramite View::assign()
.
Percorso dei file di vista
Controllore
Quando un controllore chiama view('nome_template', []);
, i file di vista vengono cercati secondo le seguenti regole:
- Se inizia con
/
, la ricerca del file di vista viene eseguita direttamente utilizzando quel percorso. - Se non inizia con
/
e non è multi-app, viene utilizzato il file di vista corrispondente inapp/view/
. - Se non inizia con
/
ed è multi-app, viene utilizzato il file di vista corrispondente inapp/nome_app/view/
. - Se non viene passato un parametro template, il file di template verrà automaticamente cercato in base alle regole 2 e 3.
Esempio:
<?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']);
}
}
Funzione Closure
La funzione closure $request->app
è vuota e non appartiene a nessuna applicazione, quindi la funzione closure utilizza i file di vista in app/view/
, ad esempio definendo la rotta in config/route.php
Route::any('/admin/user/get', function (Reqeust $reqeust) {
return view('user', []);
});
userebbe app/view/user.html
come file template (quando si utilizza un template blade, il file template sarà app/view/user.blade.php
).
Specificare l'app
Per consentire il riutilizzo dei template in modalità multi-app, view($template, $data, $app = null)
fornisce un terzo parametro $app
, che può essere utilizzato per specificare quale directory dell'applicazione utilizzare per il template. Ad esempio, view('user', [], 'admin');
forzerà l'uso del file di vista in app/admin/view/
.
Omissione del parametro template
Nella classe del controllore, è possibile omettere il parametro del template, ad esempio
<?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']);
}
}
Espandere Twig
Possiamo estendere l'istanza della vista Twig tramite il callback di configurazione view.extension
, ad esempio config/view.php
come segue
<?php
use support\view\Twig;
return [
'handler' => Twig::class,
'extension' => function (\Twig\Environment $twig) {
$twig->addExtension(new your\namespace\YourExtension()); // Aggiungere un'estensione
$twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // Aggiungere un filtro
$twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // Aggiungere una funzione
}
];
Espandere Blade
Allo stesso modo, possiamo estendere l'istanza della vista Blade tramite il callback di configurazione view.extension
, ad esempio config/view.php
come segue
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
// Aggiungere un'istruzione a blade
$blade->directive('mydate', function ($timestamp) {
return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
});
}
];
Uso del componente component in Blade
Supponiamo di voler aggiungere un componente Alert
Creare 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();
}
}
Creare app/view/components/alert.blade.php
<div>
<b style="color: red">hello blade component</b>
</div>
/config/view.php
avrà codice simile al seguente
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
$blade->component('alert', app\view\components\Alert::class);
}
];
A questo punto, il componente Blade Alert è stato configurato. Quando si utilizza il template, sarà simile al seguente
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
<x-alert/>
</body>
</html>
Espandere think-template
think-template utilizza view.options.taglib_pre_load
per estendere la libreria di tag, ad esempio
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
'options' => [
'taglib_pre_load' => your\namespace\Taglib::class,
]
];
Per ulteriori dettagli, fare riferimento a think-template 标签扩展