私は独自のMVCフレームワークを作成していて、ビューレンダラーに来ました。コントローラのvarsをViewオブジェクトに設定してから、.phtmlスクリプトのecho $ this-> myvarを使用してvarsにアクセスします。
Default.phtmlでは、メソッド$ this-> content()を呼び出してビュースクリプトを出力します。
これが私が今やっているやり方です。これはそれを行うための適切な方法ですか?
class View extends Object {
protected $_front;
public function __construct(Front $front) {
$this->_front = $front;
}
public function render() {
ob_start();
require APPLICATION_PATH . '/layouts/default.phtml' ;
ob_end_flush();
}
public function content() {
require APPLICATION_PATH . '/views/' . $this->_front->getControllerName() . '/' . $this->_front->getActionName() . '.phtml' ;
}
}
これが私がそれをした方法の例です:
<?php
class View
{
private $data = array();
private $render = FALSE;
public function __construct($template)
{
try {
$file = ROOT . '/templates/' . strtolower($template) . '.php';
if (file_exists($file)) {
$this->render = $file;
} else {
throw new customException('Template ' . $template . ' not found!');
}
}
catch (customException $e) {
echo $e->errorMessage();
}
}
public function assign($variable, $value)
{
$this->data[$variable] = $value;
}
public function __destruct()
{
extract($this->data);
include($this->render);
}
}
?>
コントローラから割り当て関数を使用して変数を割り当て、デストラクタでその配列を抽出して、ビュー内のローカル変数にします。
あなたが望むならこれを自由に使ってください、私はそれがあなたがそれをすることができる方法についてあなたにアイデアを与えることを願っています
これが完全な例です:
class Something extends Controller
{
public function index ()
{
$view = new view('templatefile');
$view->assign('variablename', 'variable content');
}
}
そしてあなたのビューファイルで:
<?php echo $variablename; ?>
単純なビュークラスの例。あなたとデビッドエリクソンのものに本当に似ています。
<?php
/**
* View-specific wrapper.
* Limits the accessible scope available to templates.
*/
class View{
/**
* Template being rendered.
*/
protected $template = null;
/**
* Initialize a new view context.
*/
public function __construct($template) {
$this->template = $template;
}
/**
* Safely escape/encode the provided data.
*/
public function h($data) {
return htmlspecialchars((string) $data, ENT_QUOTES, 'UTF-8');
}
/**
* Render the template, returning it's content.
* @param array $data Data made available to the view.
* @return string The rendered template.
*/
public function render(Array $data) {
extract($data);
ob_start();
include( APP_PATH . DIRECTORY_SEPARATOR . $this->template);
$content = ob_get_contents();
ob_end_clean();
return $content;
}
}
?>
クラスで定義された関数は、次のようにビュー内でアクセスできます。
<?php echo $this->h('Hello World'); ?>