Vues
webman utilise par défaut la syntaxe PHP native en tant que modèle, offrant ainsi les meilleures performances une fois que opcache est activé. En plus du modèle PHP natif, webman propose également des moteurs de modèle Twig, Blade, et think-template.
Activer opcache
Lors de l'utilisation de vues, il est fortement recommandé d'activer les options opcache.enable et opcache.enable_cli dans le fichier php.ini pour assurer les meilleures performances du moteur de modèle.
Installation de Twig
-
Installation via Composer
composer require twig/twig -
Modifier la configuration
config/view.phpcomme suit<?php use support\view\Twig; return [ 'handler' => Twig::class ];Remarque
D'autres options de configuration peuvent être transmises via l'option, par exemplereturn [ 'handler' => Twig::class, 'options' => [ 'debug' => false, 'charset' => 'utf-8' ] ];
Installation de Blade
-
Installation via Composer
composer require psr/container ^1.1.1 webman/blade -
Modifier la configuration
config/view.phpcomme suit<?php use support\view\Blade; return [ 'handler' => Blade::class ];
Installation de think-template
-
Installation via Composer
composer require topthink/think-template -
Modifier la configuration
config/view.phpcomme suit<?php use support\view\ThinkPHP; return [ 'handler' => ThinkPHP::class, ];Remarque
D'autres options de configuration peuvent être transmises via l'option, par exemplereturn [ 'handler' => ThinkPHP::class, 'options' => [ 'view_suffix' => 'html', 'tpl_begin' => '{', 'tpl_end' => '}' ] ];
Exemple de moteur de modèle PHP natif
Créer le fichier app/controller/UserController.php comme suit
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Créer le fichier app/view/user/hello.html comme suit
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
Exemple de moteur de modèle Twig
Modifier la configuration config/view.php comme suit
<?php
use support\view\Twig;
return [
'handler' => Twig::class
];
Fichier app/controller/UserController.php comme suit
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Fichier app/view/user/hello.html comme suit
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>
Pour plus de documentation, voir Twig.
Exemple de moteur de modèle Blade
Modifier la configuration config/view.php comme suit
<?php
use support\view\Blade;
return [
'handler' => Blade::class
];
Fichier app/controller/UserController.php comme suit
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Fichier app/view/user/hello.blade.php comme suit
Attention : la extension du modèle Blade est
.blade.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>
Pour plus de documentation, voir Blade.
Exemple de moteur de modèle ThinkPHP
Modifier la configuration config/view.php comme suit
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class
];
Fichier app/controller/UserController.php comme suit
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Fichier app/view/user/hello.html comme suit
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>
Pour plus de documentation, voir think-template.
Attribution de modèle
En plus d'utiliser view(template, tableau_de_variables) pour attribuer le modèle, nous pouvons également attribuer le modèle à tout endroit en appelant View::assign(). Par exemple :
<?php
namespace app\controller;
use support\Request;
use support\View;
class UserController
{
public function hello(Request $request)
{
View::assign([
'name1' => 'valeur1',
'name2'=> 'valeur2',
]);
View::assign('name3', 'valeur3');
return view('user/test', ['name' => 'webman']);
}
}
View::assign() est très utile dans certains scénarios. Par exemple, si chaque page d'un système doit afficher les informations de l'utilisateur connecté dans l'en-tête, il serait fastidieux de transmettre ces informations à chaque page en utilisant view('template', ['user_info' => 'informations_utilisateur']). La solution consiste à obtenir les informations de l'utilisateur dans le middleware, puis à attribuer les informations de l'utilisateur au modèle via View::assign().
Concernant les chemins de fichier modèle
Contrôleur
Lorsqu'un contrôleur appelle view('nom_du_modèle',[]);, le fichier de vue est recherché selon les règles suivantes :
- Si le chemin commence par
/, ce chemin est utilisé directement pour localiser le fichier de vue. - Si le chemin ne commence pas par
/et qu'il ne s'agit pas d'une application multiple, le fichier de vue correspondant est recherché dansapp/view/. - Si le chemin ne commence pas par
/et qu'il s'agit d'applications multiples, le fichier de vue correspondant est recherché dansapp/nom_application/view/. - Si aucun paramètre de modèle n'est transmis, le fichier de modèle est automatiquement localisé selon les règles 2 et 3.
Exemple :
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
// Équivalent à return view('user/hello', ['name' => 'webman']);
// Équivalent à return view('/app/view/user/hello', ['name' => 'webman']);
return view(['name' => 'webman']);
}
}
Fonction de fermeture
Étant donné que la variable $request->app est vide pour une fonction de fermeture qui n'appartient à aucune application, le modèle est recherché dans app/view/. Par exemple, lors de la définition des itinéraires dans le fichier config/route.php comme suit :
Route::any('/admin/user/get', function (Reqeust $reqeust) {
return view('user', []);
});
le modèle utilisé sera app/view/user.html (lorsque le modèle Blade est utilisé, le modèle sera app/view/user.blade.php).
Spécifier l'application
Pour permettre la réutilisation des modèles dans le cas de multiples applications, view($template, $data, $app = null) propose un troisième argument $app qui permet de spécifier le dossier d'application à partir duquel le modèle doit être chargé. Par exemple, view('user', [], 'admin') forcera l'utilisation du modèle dans app/admin/view/.
Omettre le paramètre de modèle
Dans les contrôleurs basés sur des classes, vous pouvez omettre le paramètre de modèle. Par exemple :
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
// Équivalent à return view('user/hello', ['name' => 'webman']);
// Équivalent à return view('/app/view/user/hello', ['name' => 'webman']);
return view(['name' => 'webman']);
}
}
Extension de twig
Remarque
Cette fonctionnalité nécessite webman-framework>=1.4.8.
Nous pouvons étendre l'instance de vue twig en utilisant le callback fourni dans la configuration view.extension, par exemple dans config/view.php comme suit :
<?php
use support\view\Twig;
return [
'handler' => Twig::class,
'extension' => function (Twig\Environment $twig) {
$twig->addExtension(new your\namespace\YourExtension()); // Ajouter une extension
$twig->addFilter(new Twig\TwigFilter('rot13', 'str_rot13')); // Ajouter un filtre
$twig->addFunction(new Twig\TwigFunction('function_name', function () {})); // Ajouter une fonction
}
];
Extension de Blade
Remarque
Cette fonctionnalité nécessite webman-framework>=1.4.8.
De la même manière, nous pouvons étendre l'instance de vue Blade en utilisant le callback fourni dans la configuration view.extension, par exemple dans config/view.php comme suit :
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
// Ajouter des instructions à Blade
$blade->directive('mydate', function ($timestamp) {
return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
});
}
];
Utilisation de composants avec Blade
Remarque
Nécessite webman/blade>=1.5.2
Supposons que vous vouliez ajouter un composant Alert.
Créez 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();
}
}
Créez app/view/components/alert.blade.php
<div>
<b style="color: red">hello blade component</b>
</div>
Dans /config/view.php, le code ressemblerait à ceci
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
$blade->component('alert', app\view\components\Alert::class);
}
];
Ainsi, le composant Alert de Blade est configuré. Pour l'utiliser dans le modèle, faites comme suit
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
<x-alert/>
</body>
</html>
Extension de think-template
think-template utilise view.options.taglib_pre_load pour étendre les bibliothèques de balises, par exemple
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
'options' => [
'taglib_pre_load' => your\namspace\Taglib::class,
]
];
Pour plus de détails, voir l'extension de balises de think-template