Ansichten

Webman verwendet standardmäßig die native PHP-Syntax als Vorlage, die bei aktivierendem opcache die beste Leistung bietet. Neben der nativen PHP-Vorlage bietet Webman auch die Template-Engines Twig, Blade und think-template an.

Aktivieren von Opcache

Beim Arbeiten mit Ansichten wird dringend empfohlen, die Optionen opcache.enable und opcache.enable_cli in der php.ini zu aktivieren, damit die Template-Engine die beste Leistung erreicht.

Twig installieren

  1. Installation mit Composer

composer require twig/twig

  1. Ändern Sie die Konfiguration in config/view.php zu:
    
    <?php
    use support\view\Twig;

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

> **Hinweis**
> Andere Konfigurationsoptionen werden über `options` übergeben, zum Beispiel: 

```php
return [
    'handler' => Twig::class,
    'options' => [
        'debug' => false,
        'charset' => 'utf-8'
    ]
];

Blade installieren

  1. Installation mit Composer
composer require psr/container ^1.1.1 webman/blade
  1. Ändern Sie die Konfiguration in config/view.php zu:
    
    <?php
    use support\view\Blade;

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


## Think-template installieren

1. Installation mit Composer

`composer require topthink/think-template`

2. Ändern Sie die Konfiguration in `config/view.php` zu:
```php
<?php
use support\view\ThinkPHP;

return [
    'handler' => ThinkPHP::class,
];

Hinweis
Andere Konfigurationsoptionen werden über options übergeben, zum Beispiel:

return [
    'handler' => ThinkPHP::class,
    'options' => [
        'view_suffix' => 'html',
        'tpl_begin' => '{',
        'tpl_end' => '}'
    ]
];

Beispiel für native PHP-Template-Engine

Erstellen Sie die Datei app/controller/UserController.php wie folgt:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Erstellen Sie die Datei app/view/user/hello.html wie folgt:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>

Beispiel für Twig-Template-Engine

Ändern Sie die Konfiguration in config/view.php zu:

<?php
use support\view\Twig;

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

Die Datei app/controller/UserController.php sieht wie folgt aus:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Die Datei app/view/user/hello.html sieht wie folgt aus:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>

Weitere Dokumentation finden Sie unter Twig

Beispiel für Blade-Template

Ändern Sie die Konfiguration in config/view.php zu:

<?php
use support\view\Blade;

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

Die Datei app/controller/UserController.php sieht wie folgt aus:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Die Datei app/view/user/hello.blade.php sieht wie folgt aus:

Hinweis: Die Suffixe für Blade-Templates sind .blade.php

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>

Weitere Dokumentation finden Sie unter Blade

Beispiel für ThinkPHP-Template

Ändern Sie die Konfiguration in config/view.php zu:

<?php
use support\view\ThinkPHP;

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

Die Datei app/controller/UserController.php sieht wie folgt aus:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

Die Datei app/view/user/hello.html sieht wie folgt aus:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>

Weitere Dokumentation finden Sie unter think-template

Template-Zuweisung

Neben der Verwendung von view(Template, Variablenarray) zur Zuweisung von Werten an das Template, können wir auch an beliebiger Stelle durch Aufruf von View::assign() Werte an das Template zuweisen. Zum Beispiel:

<?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() ist in bestimmten Szenarien sehr nützlich. Beispielsweise, wenn in einem System auf jeder Seite die Informationen des aktuell angemeldeten Benutzers angezeigt werden müssen, wäre es sehr umständlich, diese Informationen durch view('Template', ['user_info' => 'Benutzerinformationen']); zuzuweisen. Die Lösung besteht darin, die Benutzerinformationen im Middleware abzurufen und dann View::assign() zu verwenden, um die Benutzerinformationen der Vorlage zuzuweisen.

Informationen zu den Pfaden der Ansichtsdateien

Controller

Wenn der Controller view('TemplateName', []); aufruft, wird die Ansichtsdatei nach folgenden Regeln gesucht:

  1. Beginnt mit /, wird der Pfad direkt verwendet, um die Ansichtsdatei zu suchen.
  2. Beginnt nicht mit / und ist keine Multianwendung, wird die entsprechende Ansichtsdatei im Verzeichnis app/view/ verwendet.
  3. Beginnt nicht mit / und ist eine Multianwendung, wird die entsprechende Ansichtsdatei im Verzeichnis app/Anwendungsname/view/ verwendet.
  4. Wenn kein Template-Parameter übergeben wird, wird die Template-Datei automatisch gemäß den Regeln 2 und 3 gesucht.

Beispiel:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // Entspricht return view('user/hello', ['name' => 'webman']);
        // Entspricht return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

Closure-Funktion

Die Closure-Funktion $request->app ist leer und gehört zu keiner Anwendung, daher verwendet die Closure-Funktion die Ansichtsdateien im Verzeichnis app/view/. Zum Beispiel, wenn in config/route.php Routen definiert sind:

Route::any('/admin/user/get', function (Request $request) {
    return view('user', []);
});

wird die Datei app/view/user.html als Template-Datei verwendet (wenn die Blade-Template verwendet wird, lautet der Template-Dateiname app/view/user.blade.php).

Bestimmte Anwendung

Um Templates im Multianwendungs-Modus wiederverwendbar zu machen, bietet view($template, $data, $app = null) den dritten Parameter $app, mit dem angegeben werden kann, aus welchem Anwendungsverzeichnis das Template verwendet werden soll. Zum Beispiel view('user', [], 'admin'); zwingt die Verwendung der Ansichtsdatei im Verzeichnis app/admin/view/.

Template-Parameter weglassen

In der Klassensteuerung kann der Template-Parameter weggelassen werden, zum Beispiel:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // Entspricht return view('user/hello', ['name' => 'webman']);
        // Entspricht return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

Twig erweitern

Wir können Twig-Ansichten durch Rückrufe in der Konfiguration view.extension erweitern, zum Beispiel in config/view.php:

<?php
use support\view\Twig;
return [
    'handler' => Twig::class,
    'extension' => function (\Twig\Environment $twig) {
        $twig->addExtension(new your\namespace\YourExtension()); // Hinzufügen von Extension
        $twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // Hinzufügen von Filter
        $twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // Hinzufügen von Funktion
    }
];

Blade erweitern

Auf ähnliche Weise können wir Blade-Ansichten durch Rückrufe in der Konfiguration view.extension erweitern, zum Beispiel in config/view.php:

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        // Anweisungen zu Blade hinzufügen
        $blade->directive('mydate', function ($timestamp) {
            return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
        });
    }
];

Blade-Komponenten verwenden

Angenommen, wir möchten eine Alert-Komponente hinzufügen.

Erstellen Sie 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();
    }
}

Erstellen Sie app/view/components/alert.blade.php:

<div>
    <b style="color: red">hello blade component</b>
</div>

Ähnlicher Code in /config/view.php:

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        $blade->component('alert', app\view\components\Alert::class);
    }
];

Damit ist die Blade-Komponente Alert eingerichtet, die im Template wie folgt verwendet werden kann:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>

<x-alert/>

</body>
</html>

think-template erweitern

think-template verwendet view.options.taglib_pre_load, um die Tag-Bibliothek zu erweitern, zum Beispiel:

<?php
use support\view\ThinkPHP;
return [
    'handler' => ThinkPHP::class,
    'options' => [
        'taglib_pre_load' => your\namespace\Taglib::class,
    ]
];

Details finden Sie unter think-template-Tag-Erweiterung