Вы в основном ищете слой абстрагированного представления. Для этого я бы определил интерфейс представления, который просто принимает данные и возвращает строковый ответ. Примерно так:
interface View {
function render($viewName, $data);
}
Теперь вы можете создать реализацию этого:
class PhpFileView implements View {
private $baseDir;
private $format;
public function __construct($baseDir) {
$this->baseDir = $baseDir;
$this->format = 'html';
}
public function setFormat($format) {
$this->format = $format;
}
public function render($viewName, $data) {
ob_start();
require "{$this->baseDir}/$viewName.{$this->format}.php";
return ob_get_clean();
}
}
Теперь вы можете дать вашему контроллеру экземпляр класса PhpFileView и сделать что-то вроде этого:
class MyController {
protected $view;
public function __construct($config) {
$this->view = new PhpFileView($config['view_dir']);
}
public function indexAction($params) {
$this->view->setFormat($params['format']);
return $this->view->render('my/index', array(
'some_var' => 'some value',
));
}
}
$config = array('view_dir' => 'app/views');
$controller = new MyController($config);
// format could be dynamically set to 'xml', yaml, anything
$params = array_merge($_REQUEST, array('format' => 'html'));
echo $controller->indexAction($params);
Это дает вам большую гибкость, поскольку вы можете установить любой формат, который вы хотите, в $params['format']
, который затем используется для включения $viewdir/$viewName.$format.php
. В нашем примере это будет отображать app/views/my/index.html.php
.
Внутри этого файла представления у вас есть доступ к переменной $data
. Таким образом, вы могли бы сделать что-то вроде <?php echo $data['some_var']; ?>
.
Большим преимуществом такой системы является то, что вы можете легко добавить поддержку для механизмов альтернативного представления, таких как Twig (вам следует взглянуть на это).