ビューレンダラ¶
view()
関数は renderer
サービスのインスタンスを確保し、データを設定し、ビューを表示するのに便利な関数です。たいていはこれで十分なのですが、もっと直接的な操作をしたいこともあるでしょう。
その場合は View サービスに直接アクセスできます:
$view = \Config\Services::renderer();
別の方法として、View
クラスをデフォルトとして使用していないなら、直接インスタンス化することもできます:
$view = new \CodeIgniter\View\View();
重要
サービスの作成はコントローラ内でのみ実施すべきです。もしライブラリ内で View クラスにアクセスしたいなら、ライブラリのコンストラクタに依存する形で設定する必要があります。
そして、ビューが提供する3つの標準的なメソッドを使えます: render(viewpath, options, save)、setVar(name, value, context)、setData(data, context) です。
これは何をするか¶
View
クラスはアプリケーションのビューディレクトリに保存された従来型の HTML/PHP スクリプトを処理するものであり、ビューのパラメータを PHP 変数に展開し、スクリプト内でアクセスできるようにするものです。
これは、ビューのパラメータ名が PHP 変数名として正しい必要があることを意味します。
View クラスは内部的に連想配列を使用し、render()
を呼び出すまでにパラメータを保持します。これは、パラメータ名または変数名がユニークである必要があり、後から来た変数が先に来た変数を上書きすることを意味します。
これはまた、スクリプト内で、別のコンテキストでエスケープするパラメータ値に影響があります。エスケープした値それぞれにユニークな名前をつける必要があります。
値が配列であるパラメータを使うことに特別な意味はありません。PHP コード内で配列を適切に処理することは、あなた次第です。
メソッドチェーン¶
setVar() と setData() メソッドはチェーンできます。複数の異なる呼び出しをまとめてつなげることができます:
$view->setVar('one', $one)
->setVar('two', $two)
->render('myView');
データのエスケープ¶
setVar()
と setData()
メソッドにデータを渡す際、クロスサイトスクリプティング攻撃対策としてデータをエスケープするオプションがあります。それぞれのメソッドの最後の引数として、データをエスケープしたいコンテキストを渡してください。コンテキストの説明については後述参照です。
もしエスケープしたくないなら、それぞれのメソッドの最後の引数に null または raw を渡してください:
$view->setVar('one', $one, 'raw');
データをエスケープしないことを選択したか、またはオブジェクトインスタンスを渡した場合は、ビューの中で esc()
関数を使うことで手動でエスケープできます。第1引数はエスケープする文字列です。第2引数はエスケープのコンテキストです(後述参照):
<?= \esc($object->getStat()) ?>
エスケープのコンテキスト¶
デフォルトでは、esc()
と、次いで、setVar()
と setData()
メソッドは、エスケープするのは標準的な HTML の中で使うのだと仮定します。しかしながら、データは Javascript、CSS、または href 属性の中などで使われることを意図しているかもしれず、効力を持つには異なるエスケープルールが必要です。第2引数にはコンテキストの名前を渡します。使えるコンテキストは 'html'、'js'、'css'、'url'、'attr'です:
<a href="<?= esc($url, 'url') ?>" data-foo="<?= esc($bar, 'attr') ?>">Some Link</a>
<script>
var siteName = '<?= esc($siteName, 'js') ?>';
</script>
<style>
body {
background-color: <?= esc('bgColor', 'css') ?>
}
</style>
ビューレンダラのオプション¶
render()
と renderString()
メソッドにはいくつかのオプションを渡せます:
cache
- ビューの結果を保持する秒数; renderString() では無視されますcache_name
- ビュー結果のキャッシュを保持/取得するのに使用する ID; デフォルトではビューのpath; renderString() では無視されますsaveData
- ビューのパラメータを後続の呼び出しにも残す必要がある場合に true
-
CodeIgniter\View\View
-
render
($view[, $options[, $saveData=false]]])¶ パラメータ: - $view (string) -- ビューのソースコードのファイル名
- $options (array) -- オプションの連想配列
- $saveData (boolean) -- true なら他の呼び出しのためにデータを保持し、false ならビューの出力後に破棄します
戻り値: 選択したビューの出力テキスト
戻り値の型: string
ファイル名と、すでに設定されているデータから出力を組み立てます:
echo $view->render('myview');
-
renderString
($view[, $options[, $saveData=false]]])¶ パラメータ: - $view (string) -- 出力する内容、例えばデータベースから取得した内容
- $options (array) -- オプションの連想配列
- $saveData (boolean) -- true なら他の呼び出しのためにデータを保持し、false ならビューの出力後に破棄します
戻り値: 選択したビューの出力テキスト
戻り値の型: string
ビューのコード断片と、すでに設定されているデータから出力を組み立てます:
echo $view->renderString('<div>マイ・シャローナ</div>');
これは、データベースに保存されているなどの内容を出力するのに使われます。しかし、これがセキュリティ脆弱性につながりうることを認識する必要があります。必ず このようなデータはバリデーションをかけ、そしておそらくは適切にエスケープしなければなりません!
-
setData
([$data[, $context=null]])¶ パラメータ: - $data (array) -- ビューデータの文字列の連想配列
- $context (string) -- エスケープに使うコンテキスト
戻り値: Renderer(メソッドチェーン)
戻り値の型: CodeIgniter\View\RendererInterface.
複数のビューデータを一度に設定します:
$view->setData(['name'=>'ジョージ', 'position'=>'ボス']);
サポートしているエスケープコンテキスト: html、css、js、url、attr、raw。 'raw' の場合はエスケープしません。
それぞれの呼び出しによりデータの配列は、ビューがレンダリングされるまでこのオブジェクトに蓄積されます。
-
setVar
($name[, $value=null[, $context=null]])¶ パラメータ: - $name (string) -- ビューデータの変数名
- $value (mixed) -- このビューデータの値
- $context (string) -- エスケープに使うコンテキスト
戻り値: Renderer(メソッドチェーン)
戻り値の型: CodeIgniter\View\RendererInterface.
ビューデータをひとつ設定します:
$view->setVar('name','ジョー','html');
サポートしているエスケープコンテキスト: html、css、js、url、attr、raw。 'raw' の場合はエスケープしません。
もしこのオブジェクトに以前使った変数をまた使ったなら、既存の値は新しいもので置き換えられます。
-