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

  1. Instalación con Composer

composer require twig/twig

  1. 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

  1. Instalación con Composer
composer require psr/container ^1.1.1 webman/blade
  1. 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 de options, 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:

  1. Si comienza con /, se utiliza directamente esa ruta para buscar el archivo de vista.
  2. Si no comienza con / y no es una aplicación múltiple, se utiliza el archivo de vista correspondiente en app/view/.
  3. Si no comienza con / y es una aplicación múltiple, se utiliza el archivo de vista correspondiente en app/nombre de la aplicación/view/.
  4. 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