Vista
Webman utiliza por defecto la sintaxis nativa de PHP como plantilla, y ofrece el mejor rendimiento al tener opcache
habilitado. Además de la plantilla nativa de PHP, Webman también proporciona motores de plantillas como Twig, Blade y think-template.
Habilitar opcache
Al utilizar vistas, se recomienda encarecidamente habilitar las opciones opcache.enable
y opcache.enable_cli
en php.ini
, para que el motor de plantillas alcance el mejor rendimiento.
Instalar Twig
- Instalación con Composer
composer require twig/twig
- Modificar la configuración
config/view.php
a<?php use support\view\Twig;
return [
'handler' => Twig::class
];
> **Sugerencia**
> Otras opciones de configuración se pasan a través de `options`, por ejemplo
```php
return [
'handler' => Twig::class,
'options' => [
'debug' => false,
'charset' => 'utf-8'
]
];
Instalar Blade
- Instalación con Composer
composer require psr/container ^1.1.1 webman/blade
- Modificar la configuración
config/view.php
a<?php use support\view\Blade;
return [
'handler' => Blade::class
];
## Instalar think-template
1. Instalación con Composer
`composer require topthink/think-template`
2. Modificar la configuración `config/view.php` a
```php
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
];
Sugerencia
Otras opciones de configuración se pasan a través deoptions
, por ejemplo
return [
'handler' => ThinkPHP::class,
'options' => [
'view_suffix' => 'html',
'tpl_begin' => '{',
'tpl_end' => '}'
]
];
Ejemplo de motor de plantillas PHP nativo
Cree el archivo app/controller/UserController.php
como sigue
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}
Cree un nuevo archivo app/view/user/hello.html
como sigue
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
Ejemplo de motor de plantillas Twig
Modifique la configuración config/view.php
a
<?php
use support\view\Twig;
return [
'handler' => Twig::class
];
app/controller/UserController.php
como sigue
<?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
como sigue
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>
Para más documentación consulte Twig
Ejemplo de plantilla Blade
Modifique la configuración config/view.php
a
<?php
use support\view\Blade;
return [
'handler' => Blade::class
];
app/controller/UserController.php
como sigue
<?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
como sigue
Nota: la extensión de la plantilla Blade es
.blade.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>
Para más documentación consulte Blade
Ejemplo de plantilla ThinkPHP
Modifique la configuración config/view.php
a
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class
];
app/controller/UserController.php
como sigue
<?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
como sigue
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>
Para más documentación consulte think-template
Asignación de valores a las plantillas
Además de utilizar view(plantilla, array de variables)
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 en un sistema se necesita mostrar la información del usuario actual en la parte superior de cada página, sería muy engorroso asignar esta información a través de view('plantilla', ['user_info' => 'información del usuario']);
en cada página. La solución es obtener la información del usuario en el middleware y luego asignar esta información a la plantilla mediante View::assign()
.
Sobre la ruta de archivos de las vistas
Controlador
Cuando el controlador llama a view('nombre de la plantilla', []);
, el archivo de vista se busca de acuerdo con las siguientes reglas:
- Si comienza con
/
, se utiliza directamente esa ruta para buscar el archivo de vista. - Si no comienza con
/
y no es una aplicación múltiple, se utiliza el archivo de vista correspondiente enapp/view/
. - Si no comienza con
/
y es una aplicación múltiple, se utiliza el archivo de vista correspondiente enapp/nombre de la aplicación/view/
. - Si no se pasa el parámetro de la plantilla, se buscará automáticamente el archivo de plantilla de acuerdo con 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 anónimas
La función anónima $request->app
está vacía y no pertenece a ninguna aplicación, por lo que la función anónima utiliza los archivos de vista en app/view/
, por ejemplo, en la definición de rutas en config/route.php
Route::any('/admin/user/get', function (Request $request) {
return view('user', []);
});
utilizará app/view/user.html
como archivo de plantilla (cuando se utiliza la plantilla blade, el archivo de plantilla será app/view/user.blade.php
).
Aplicación especificada
Para que las plantillas puedan ser reutilizadas en el modo de múltiples aplicaciones, view($template, $data, $app = null)
proporciona un tercer parámetro $app
, que puede usarse para especificar qué directorio de aplicación utilizar para la plantilla. Por ejemplo, view('user', [], 'admin');
forzará a usar el archivo de vista en app/admin/view/
.
Omitir parámetros de plantilla
En el controlador de la clase, se pueden omitir los parámetros 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']);
}
}
Extender Twig
Podemos extender la instancia de vista Twig al proporcionar un callback para la configuración view.extension
, por ejemplo, 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()); // Añadir extensión
$twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // Añadir filtro
$twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // Añadir función
}
];
Extender Blade
Del mismo modo, podemos extender la instancia de vista Blade al proporcionar un callback para la configuración view.extension
, por ejemplo, config/view.php
como sigue
<?php
use support\view\Blade;
return [
'handler' => Blade::class,
'extension' => function (Jenssegers\Blade\Blade $blade) {
// Añadir directivas a Blade
$blade->directive('mydate', function ($timestamp) {
return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
});
}
];
Uso de componentes en Blade
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">hello blade component</b>
</div>
/config/view.php
similar a el 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);
}
];
Hasta aquí, el componente Alert de Blade está configurado, utilizándolo en la plantilla sería algo como sigue
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
<x-alert/>
</body>
</html>
Extender think-template
think-template utiliza view.options.taglib_pre_load
para extender la biblioteca de etiquetas, por ejemplo
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
'options' => [
'taglib_pre_load' => your\namspace\Taglib::class,
]
];
Consulte más sobre la extensión de etiquetas think-template