我实际上创建了一个框架,该框架可以按照您尝试实现的方式工作。我认为您缺少的是 RoutingHandler 类。路由是对 URL 的物理操作,它告诉您的应用程序要加载哪个 Controller 以及要运行哪个 Action。
在我的世界里我也有模块,所以基本的路由方案是
Module -> Controller -> Action
这三个项目以这种方式映射到我的 URI 方案。变量也可以像这样附加......
http://www.domain.com/module/controller/action/var1/val1/var2/val2
那么,在解析 URI 并将控制权传递给适当的控制器和操作之后会发生什么?让我们编写一些代码来演示一个简单的示例......
<?php
class indexController extends Controller {
protected function Initialize() {
$this->objHomeModel = new HomeModel;
$this->objHeader = new Header();
$this->objFooter = new Footer();
$this->objHeader
->SetPageId('home');
}
public function indexAction() {
$this->objHeader->SetPageTitle('This is my page title.');
}
// other actions and/or helper methods...
}
?>
在该Initialize
方法中,我设置了一些控制器范围的东西,并获取我的模型实例以供以后使用。真正的肉在indexAction
方法。您可以在此处设置要在视图中使用的内容。例如...
public function randomAction() {
$this->_CONTROL->Append($intSomeVar, 42);
}
_CONTROL
是我操作并传递给视图的一组值。该类Controller
知道如何为 View 找到正确的模板,因为它以 Action 命名(并且在同级目录中)。
Controller
父类采用动作方法的名称并像这样解析它......
indexAction -> index.tpl.php
您还可以在这里做一些其他有趣的事情,例如...
Application::SetNoRender();
...会告诉控制器不要在模板内渲染,而只是完成该方法。这对于您实际上不想输出任何内容的情况很有用。
最后,所有的控制器、模型和视图都存在于它们自己的模块目录中,就像这样......
my_module
controllers
indexController.class.php
someotherController.class.php
:
:
models
HomeModel.class.php
:
:
templates
index.tpl.php
someother.tpl.php
:
:
我可以根据需要拥有尽可能多的模块,这意味着我可以通过模块和/或控制器分离功能。
我可以继续,但我是凭记忆写的,这里和那里都有一些皱纹,但希望这能让你深思。