ビュー

webmanはデフォルトでPHPのネイティブ構文をテンプレートとして使用し、opcacheを有効にすると最良のパフォーマンスを発揮します。PHPのネイティブテンプレートに加えて、webmanはTwigBladethink-template テンプレートエンジンも提供しています。

opcacheの有効化

ビューを使用する際には、php.iniopcache.enableopcache.enable_cliの2つのオプションを有効にすることを強くお勧めします。これにより、テンプレートエンジンのパフォーマンスが最適化されます。

Twigのインストール

  1. composerを使用してインストール

composer require twig/twig

  1. 設定ファイルconfig/view.phpを以下のように変更します。
    
    <?php
    use support\view\Twig;

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

> **ヒント**
> 他の設定オプションは`options`を通じて渡します。例えば  

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

Bladeのインストール

  1. composerを使用してインストール
composer require psr/container ^1.1.1 webman/blade
  1. 設定ファイルconfig/view.phpを以下のように変更します。
    
    <?php
    use support\view\Blade;

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


## think-templateのインストール
1. composerを使用してインストール

`composer require topthink/think-template`

2. 設定ファイル`config/view.php`を以下のように変更します。
```php
<?php
use support\view\ThinkPHP;

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

ヒント
他の設定オプションはoptionsを通じて渡します。例えば

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

ネイティブPHPテンプレートエンジンの例

ファイル app/controller/UserController.php を以下のように作成します。

<?php
namespace app\controller;

use support\Request;

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

新しいファイル app/view/user/hello.html を以下のように作成します。

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

Twigテンプレートエンジンの例

設定ファイルconfig/view.phpを以下のように変更します。

<?php
use support\view\Twig;

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

app/controller/UserController.php は以下のようになります。

<?php
namespace app\controller;

use support\Request;

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

ファイル app/view/user/hello.html は以下のようになります。

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

詳細なドキュメントは Twig を参照してください。

Bladeテンプレートの例

設定ファイルconfig/view.phpを以下のように変更します。

<?php
use support\view\Blade;

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

app/controller/UserController.php は以下のようになります。

<?php
namespace app\controller;

use support\Request;

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

ファイル app/view/user/hello.blade.php は以下のようになります。

注意:bladeテンプレートの拡張子は.blade.phpです。

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

詳細なドキュメントは Blade を参照してください。

ThinkPHPテンプレートの例

設定ファイルconfig/view.phpを以下のように変更します。

<?php
use support\view\ThinkPHP;

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

app/controller/UserController.php は以下のようになります。

<?php
namespace app\controller;

use support\Request;

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

ファイル app/view/user/hello.html は以下のようになります。

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

詳細なドキュメントは think-template を参照してください。

テンプレートへの値の割り当て

view(テンプレート, 配列)を使用してテンプレートに値を割り当てることに加えて、View::assign()を呼び出すことで任意の場所でテンプレートに値を割り当てることもできます。例えば:

<?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()は特定のシナリオにおいて非常に便利です。例えば、各ページのヘッダーに現在のログイン者情報を表示する必要がある場合、毎ページごとにview('テンプレート', ['user_info' => 'ユーザー情報']);で値を割り当てるのは非常に面倒です。解決策は、ミドルウェアでユーザー情報を取得し、その後View::assign()を使用してテンプレートにユーザー情報を割り当てることです。

ビューファイルパスについて

コントローラ

コントローラがview('テンプレート名',[]);を呼び出すと、ビューファイルは次のルールに従って検索されます。

  1. /が先頭にある場合、そのパスで直接ビューファイルを検索します。
  2. /が先頭でなく、かつマルチアプリケーションでない場合、app/view/以下の対応するビューファイルを使用します。
  3. /が先頭でなく、かつマルチアプリケーションの場合、app/アプリ名/view/以下の対応するビューファイルを使用します。
  4. テンプレートパラメータを渡さない場合、2および3のルールに基づいて自動的にテンプレートファイルを検索します。

例:

<?php
namespace app\controller;

use support\Request;

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

クロージャ関数

クロージャ関数内では$request->app は空で、どのアプリにも属さないため、クロージャ関数はapp/view/以下のビューファイルを使用します。例えば、config/route.phpでルートを定義する場合:

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

app/view/user.htmlをテンプレートファイルとして使用します(Bladeテンプレートを使用する場合、テンプレートファイルはapp/view/user.blade.phpになります)。

指定アプリケーション

マルチアプリケーションモードでテンプレートを再利用できるように、view($template, $data, $app = null)は第三のパラメータ$appを提供し、どのアプリディレクトリのテンプレートを使用するかを指定できます。例えば、view('user', [], 'admin');は強制的にapp/admin/view/以下のビューファイルを使用します。

テンプレートパラメータの省略

クラスのコントローラ内ではテンプレートパラメータを省略できます。例えば

<?php
namespace app\controller;

use support\Request;

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

Twigの拡張

view.extensionコールバックを設定することで、Twigビューインスタンスを拡張できます。例えば、config/view.phpは以下のようになります。

<?php
use support\view\Twig;
return [
    'handler' => Twig::class,
    'extension' => function (\Twig\Environment $twig) {
        $twig->addExtension(new your\namespace\YourExtension()); // エクステンションを追加
        $twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // フィルターを追加
        $twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // 関数を追加
    }
];

Bladeの拡張

同様に、view.extensionコールバックを設定することで、Bladeビューインスタンスを拡張できます。例えば、config/view.phpは以下のようになります。

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        // Bladeにディレクティブを追加
        $blade->directive('mydate', function ($timestamp) {
            return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
        });
    }
];

Bladeでコンポーネントを使用する

例えばAlertコンポーネントを追加する必要があるとします。

新しく 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();
    }
}

新しく app/view/components/alert.blade.php を作成

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

/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);
    }
];

これで、BladeコンポーネントAlertの設定が完了しました。テンプレート内で使用する場合は、以下のようになります。

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

<x-alert/>

</body>
</html>

think-templateの拡張

think-templateはview.options.taglib_pre_loadを使用してタグライブラリを拡張します。例えば:

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

詳細は think-templateタグ拡張 を参照してください。