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

  1. Installazione tramite composer

composer require twig/twig

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

  1. Installazione tramite composer
composer require psr/container ^1.1.1 webman/blade
  1. Modificare la configurazione config/view.php in modo che sia
<?php
use support\view\Blade;

return [
    'handler' => Blade::class
];

Installare think-template

  1. Installazione tramite composer

composer require topthink/think-template

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

  1. Se inizia con /, la ricerca del file di vista viene eseguita direttamente utilizzando quel percorso.
  2. Se non inizia con / e non è multi-app, viene utilizzato il file di vista corrispondente in app/view/.
  3. Se non inizia con / ed è multi-app, viene utilizzato il file di vista corrispondente in app/nome_app/view/.
  4. 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 标签扩展