这可能有点难以理解,所以如果不够清楚,我会事先道歉。
我正在编写自己的MVC框架并再次陷入困境。
我正在为框架编写控制器类。基本上这就是它的工作原理:
泛型$ controller-> method()并引用最终控制器加载。
另一个概述:
coreController
pageController
pageControllerActionAdd
return as object to start
$controller->something(); //References pageControllerActionAdd
基本上我想要做的就是输入一个网址: http://www.mywebsite.com/page/modify/
并让脚本将PageModifyController作为变量拉出来,这样我就可以执行它的方法了。
如果你能告诉我一个更好的方法来做我正在做的事,请继续。你不必编写任何代码,只是想法会很棒。只是我目前正在做的方式非常混乱,难以调试。我将最终得到多个嵌套对象,我不喜欢它的概念。
我一直在阅读很多其他源代码,发现它也很复杂。
答案 0 :(得分:1)
我实际上创建了一个框架,可以按照您要实现的方式工作。我认为你缺少的是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
方法。您可以在此处设置要在View中使用的内容。例如......
public function randomAction() {
$this->_CONTROL->Append($intSomeVar, 42);
}
_CONTROL
是一组值,我操纵并传递给View。 Controller
类知道如何为View找到正确的模板,因为它以Action命名(并在兄弟目录中)。
Controller
父类采用动作方法的名称并像这样解析...
indexAction -> index.tpl.php
你也可以在这里做一些有趣的事情,例如......
Application::SetNoRender();
...会告诉Controller不要在模板中渲染,而只是完成方法。这对于您实际上不想输出任何内容的情况非常有用。
最后,所有控制器,模型和视图都在它们自己的Module目录中,就像这样......
my_module
controllers
indexController.class.php
someotherController.class.php
:
:
models
HomeModel.class.php
:
:
templates
index.tpl.php
someother.tpl.php
:
:
我可以拥有所需数量的模块,这意味着我可以通过模块和/或控制器分离出功能。
我可以继续,但我是从记忆中写下来的,这里和那里都有一些皱纹,但希望这给你提供了思考的食物。