のPHPマニュアルからinclude
:
ファイルがインクルードされると、そこに含まれるコードは、インクルードが発生した行の変数スコープを継承します。呼び出しファイルのその行で使用可能な変数は、その時点以降、呼び出されたファイル内で使用できます。ただし、インクルード ファイルで定義されているすべての関数とクラスには、グローバル スコープがあります。
あなたがするとき
public function somethingAction() {
$someVariable = "something";
$this->render('someLayout');
}
$someVariable
変数はスコープに限定されますsomethingAction()
。メソッドには独自の変数スコープがあるため、メソッドを呼び出してrender()
も魔法のように変数が で使用可能になるわけではありません。可能な解決策は、render()
render()
public function somethingAction() {
$this->render(
'someLayout',
array(
'someVariable' => 'something'
)
);
}
そして次に変更render()
します
public function render($Layout, array $viewData) {
$this->Layout = $Layout;
include( ... .php)
}
$viewData
インクルードされたファイルが次のようになっている場合など、他の関数やメソッドで使用しようとしていない場合は、インクルードされたファイルにアクセスできます。
<h1><?php echo $viewData['someVariable']; ?></h1>
動作しますが、次のようになっている場合:
function foo() {
return $viewData['someVariable'];
}
echo foo();
foo()
独自の変数スコープがあるため、機能しません。
ただし、コントローラーの唯一の責任は、入力を処理することです。レンダリングはビューの責任です。render()
したがって、コントローラーにはメソッドがまったくないはずです。メソッドをViewクラスに移動することを検討してから実行してください
public function somethingAction() {
$view = new View('someLayout');
$view->setData('someVariable', 'something');
$view->render();
}
View オブジェクトのrender()
メソッドは、次のように実装できます。
class View
…
$private $viewData = array();
public function setData($key, $value)
{
$this->viewData[$key] = $data;
}
public function render()
{
extract($this->viewData, EXTR_SKIP);
include sprintf('/path/to/layouts/%s.php', $this->layout);
}
このextract
関数は、キーを名前として使用して、現在のスコープ内の配列の値をインポートします。これにより、 の代わりにviewData
asでデータを使用できるようになります。ただし、使用する前に、セキュリティへの影響を理解していることを確認してください。$someVariable
$this->viewData['someVariable']
extract
これは、現在のやり方の代替案の 1 つにすぎないことに注意してください。ビューをコントローラーから完全に移動することもできます。