我正在为我的项目用PHP创建一个微MVC框架。实际上它只是VC,我没有使用模型,而是在控制器中执行所有逻辑(包括从mongodb获取数据)。
我有一个带有函数renderView(...)
的主控制器类(进行一些检查,将数据数组提取到变量,并在每个视图上调用include()),所有控制器都扩展此类。
我也写了自己的URL路由器,我可以在其中指定url将从哪个控制器调用哪个方法。 例如:
/ -> Home::index()
/users/:id -> Users::showProfilePage($id)
/settings -> Users::showSettings()
等
在我加载相同视图的几乎所有方法中:
$this->renderView("header", "sidebar", <main view for the current page>, "footer", $data);
现在,我的问题是我想在很多页面上使用这些视图,但是例如header
和sidebar
需要他们自己的逻辑(PHP代码)。如何在不将侧栏的php代码复制到呈现视图sidebar
的每个控制器和方法的情况下实现此目的?
答案 0 :(得分:0)
您真正需要的是如何管理重复模板块。块管理背后的想法非常简单:您定义$blockName => $blockPath
对,然后juse在另一个模板中使用它。
例如,您可以定义一个与此类似的数组:
$blocks = array(
'footer' => __THEME_DIR__ . '/blocks/footer.phtml',
'head' => __THEME_DIR__ . '/block/header.phtnk'
);
然后在另一个模板中使用,就像:
<!DOCTYPE HTML>
<html>
<?php $this->loadBlock('head'); ?>
<body>
<main>
...
</main>
<?php $this->loadBlock('footer'); ?>
</body>
</html>
这就是方法。但在你开始之前,你需要为所有所谓的c设置这些块
首先 - 您需要避免在每个控制器中定义$blocks
数组。要解决这个问题,您只需编写abstract
控制器,只需定义$blocks
一次,然后所有后代都会继承它。
例如,
<?php
abstract class AppPresenter extends FrameworkPresenter
{
public function __construct()
{
$this->view->registerBlocks(array(
'header' => '....'
));
}
}
class UserPresenter extends AppPresenter
{
public function indexAction()
{
return $this->view->render('/index.phtml', array(
'var' => 'val'
));
}
}