ビュー
webmanはデフォルトでPHPのネイティブ構文をテンプレートとして使用し、opcache
を有効にすると最良のパフォーマンスを発揮します。PHPのネイティブテンプレートに加えて、webmanはTwig、Blade、think-template テンプレートエンジンも提供しています。
opcacheの有効化
ビューを使用する際には、php.ini
でopcache.enable
とopcache.enable_cli
の2つのオプションを有効にすることを強くお勧めします。これにより、テンプレートエンジンのパフォーマンスが最適化されます。
Twigのインストール
- composerを使用してインストール
composer require twig/twig
- 設定ファイル
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のインストール
- composerを使用してインストール
composer require psr/container ^1.1.1 webman/blade
- 設定ファイル
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('テンプレート名',[]);
を呼び出すと、ビューファイルは次のルールに従って検索されます。
/
が先頭にある場合、そのパスで直接ビューファイルを検索します。/
が先頭でなく、かつマルチアプリケーションでない場合、app/view/
以下の対応するビューファイルを使用します。/
が先頭でなく、かつマルチアプリケーションの場合、app/アプリ名/view/
以下の対応するビューファイルを使用します。- テンプレートパラメータを渡さない場合、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タグ拡張 を参照してください。