Vistas
Por defecto, webman utiliza la sintaxis nativa de PHP como plantilla, lo cual proporciona el mejor rendimiento cuando se activa opcache. Además de las plantillas nativas de PHP, webman también ofrece motores de plantillas como Twig, Blade, think-template.
Activar opcache
Se recomienda encarecidamente activar las opciones opcache.enable y opcache.enable_cli en el archivo php.ini al usar vistas, para que el motor de plantillas alcance el mejor rendimiento.
Instalar Twig
-
Instalación mediante composer
composer require twig/twig -
Modificar la configuración en
config/view.phpde la siguiente manera<?php use support\view\Twig; return [ 'handler' => Twig::class ];Nota
Otras opciones de configuración se pueden pasar mediante options, por ejemplo:return [ 'handler' => Twig::class, 'options' => [ 'debug' => false, 'charset' => 'utf-8' ] ];
Instalar Blade
-
Instalación mediante composer
composer require psr/container ^1.1.1 webman/blade -
Modificar la configuración en
config/view.phpde la siguiente manera<?php use support\view\Blade; return [ 'handler' => Blade::class ];
Instalar think-template
-
Instalación mediante composer
composer require topthink/think-template -
Modificar la configuración en
config/view.phpde la siguiente manera<?php use support\view\ThinkPHP; return [ 'handler' => ThinkPHP::class, ];Nota
Otras opciones de configuración se pueden pasar mediante options, por ejemploreturn [ 'handler' => ThinkPHP::class, 'options' => [ 'view_suffix' => 'html', 'tpl_begin' => '{', 'tpl_end' => '}' ] ];
Ejemplo de motor de plantillas de PHP nativo
Crear el archivo app/controller/UserController.php de la siguiente manera
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Crear el archivo app/view/user/hello.html de la siguiente manera
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
Ejemplo de motor de plantillas Twig
Modificar la configuración en config/view.php de la siguiente manera
<?php
use support\view\Twig;
return [
'handler' => Twig::class
];
app/controller/UserController.php de la siguiente manera
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
El archivo app/view/user/hello.html de la siguiente manera
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>
Para más información, consulta Twig.
Ejemplo de motor de plantillas Blade
Modificar la configuración en config/view.php de la siguiente manera
<?php
use support\view\Blade;
return [
'handler' => Blade::class
];
app/controller/UserController.php de la siguiente manera
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
El archivo app/view/user/hello.blade.php de la siguiente manera
Nota: el nombre de la plantilla blade tiene la extensión
.blade.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>
Para más información, consulta Blade.
Ejemplo de motor de plantillas think-template
Modificar la configuración en config/view.php de la siguiente manera
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class
];
app/controller/UserController.php de la siguiente manera
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
El archivo app/view/user/hello.html de la siguiente manera
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>
Para más información, consulta think-template.
Asignación de plantillas
Además de utilizar view(template, array) para asignar valores a la plantilla, también podemos asignar valores a la plantilla en cualquier lugar llamando a View::assign(). Por ejemplo:
<?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() es muy útil en ciertos escenarios, por ejemplo, si cada página de un sistema necesita mostrar la información del usuario que ha iniciado sesión, asignar esta información a la plantilla mediante View::assign() sería muy útil. La solución sería obtener la información del usuario en el middleware y luego asignar la información del usuario a la plantilla mediante View::assign().
Acerca de la ruta de archivos de vista
Controladores
Cuando un controlador llama a view('nombre_plantilla', []), el archivo de vista se busca de acuerdo con las siguientes reglas:
- Si la ruta comienza con
/, utilice esa ruta directamente para localizar el archivo de vista. - Si no comienza con
/y no es una aplicación múltiple, utilice el archivo de vista correspondiente enapp/view/. - Si no comienza con
/y es una aplicación múltiple, utilice el archivo de vista correspondiente enapp/nombre_aplicacion/view/. - Si no se pasa el parámetro de plantilla, el archivo de plantilla se localiza automáticamente según las reglas 2 y 3.
Ejemplo:
<?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']);
}
}
Funciones de cierre
La variable $request->app estará vacía para las funciones de cierre, ya que no pertenecen a ninguna aplicación en particular. Por lo tanto, las funciones de cierre utilizarán los archivos de vista en app/view/, por ejemplo, al definir rutas en el archivo config/route.php de la siguiente manera
Route::any('/admin/user/get', function (Reqeust $reqeust) {
return view('user', []);
});
Se utilizará el archivo de vista app/view/user.html como plantilla (si se está utilizando blade, el archivo de plantilla sería app/view/user.blade.php).
Especificar aplicación
Para reutilizar plantillas en el modo de múltiples aplicaciones, el método view($template, $data, $app = null) proporciona un tercer parámetro $app que se puede utilizar para especificar qué directorio de aplicación se debe utilizar para las plantillas. Por ejemplo, view('user', [], 'admin') forzará el uso de archivos de vista en app/admin/view/.
Omitir el parámetro de plantilla
En los controladores basados en clases, puede omitir el parámetro de plantilla. Por ejemplo:
<?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']);
}
}
Ampliar Twig
Nota
Esta función requiere webman-framework>=1.4.8
Podemos extender la instancia de vista Twig mediante la devolución de la configuración view.extension, por ejemplo, en config/view.php como sigue
<?php
use support\view\Twig;
return [
'handler' => Twig::class,
'extension' => function (Twig\Environment $twig) {
$twig->addExtension(new your\namespace\YourExtension()); // Agregar extensión
$twig->addFilter(new Twig\TwigFilter('rot13', 'str_rot13')); // Agregar filtro
$twig->addFunction(new Twig\TwigFunction('function_name', function () {})); // Agregar función
}
];
Ampliar Blade
Nota
Esta función requiere webman-framework>=1.4.8
Del mismo modo, podemos extender la instancia de vista Blade mediante la devolución de la configuración view.extension, por ejemplo, en config/view.php como sigue
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
// Agregar directiva a blade
$blade->directive('mydate', function ($timestamp) {
return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
});
}
];
Uso del componente blade
Nota
Se requiere webman/blade>=1.5.2
Supongamos que necesitamos agregar un componente Alert.
Cree 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();
}
}
Cree app/view/components/alert.blade.php
<div>
<b style="color: red">hola componente de blade</b>
</div>
/config/view.php debería ser similar al siguiente código
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
$blade->component('alert', app\view\components\Alert::class);
}
];
Con esto, se ha configurado el componente Alert de Blade. Al utilizarlo en la plantilla, se vería algo como:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
<x-alert/>
</body>
</html>
Extensión para think-template
think-template utiliza view.options.taglib_pre_load para extender las librerías de etiquetas, por ejemplo:
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
'options' => [
'taglib_pre_load' => your\namspace\Taglib::class,
]
];
Para más detalles, consulta Extensión de etiquetas de think-template