ビューレンダラ

Using the View Renderer

The view() function is a convenience function that grabs an instance of the renderer service, sets the data, and renders the view. While this is often exactly what you want, you may find times where you want to work with it more directly. その場合は View サービスに直接アクセスできます:

$view = \Config\Services::renderer();

別の方法として、View クラスをデフォルトとして使用していないなら、直接インスタンス化することもできます:

$view = new \CodeIgniter\View\View();

重要

サービスの作成はコントローラ内でのみ実施すべきです。If you need access to the View class from a library, you should set that as a dependency in your library's constructor.

Then you can use any of the three standard methods that it provides: render(viewpath, options, save), setVar(name, value, context) and setData(data, context).

これは何をするか

The View class processes conventional HTML/PHP scripts stored in the application's view path, after extracting view parameters into PHP variables, accessible inside the scripts. これは、ビューのパラメータ名が PHP 変数名として正しい必要があることを意味します。

View クラスは内部的に連想配列を使用し、render() を呼び出すまでにパラメータを保持します。これは、パラメータ名または変数名がユニークである必要があり、後から来た変数が先に来た変数を上書きすることを意味します。

これはまた、スクリプト内で、別のコンテキストでエスケープするパラメータ値に影響があります。エスケープした値それぞれにユニークな名前をつける必要があります。

値が配列であるパラメータを使うことに特別な意味はありません。It is up to you to process the array appropriately in your PHP code.

メソッドチェーン

The setVar() and setData() methods are chainable, allowing you to combine a number of different calls together in a chain:

$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

Class Reference

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' の場合はエスケープしません。

もしこのオブジェクトに以前使った変数をまた使ったなら、既存の値は新しいもので置き換えられます。