1

这可能有点难以理解,所以如果不够清楚,我提前道歉。

我正在编写自己的 MVC 框架,但又一次陷入困境。

我正在为框架编写控制器类。基本上这是它的工作原理:

  • 实例化扩展抽象类的类 coreController
  • coreController 通过解释查询字符串设置要加载的控制器
  • 查询存储在变量中的字符串值
  • 其他变量赋值
  • 新控制器已加载
  • 新控制器检查是否需要实例化动作对象。
  • 新的动作控制器已加载
  • 动作控制器检查它是否是所需的最终对象。
  • 动作控制器作为要在脚本的其余部分引用的对象返回。

可以调用通用 $controller->method() 并引用加载的最终控制器。

另一个概述:

coreController
    pageController
       pageControllerActionAdd
       return as object to start

$controller->something(); //References pageControllerActionAdd

基本上我想要做的是能够输入一个网址,如: http ://www.mywebsite.com/page/modify/

并让脚本将 PageModifyController 作为变量提取,以便我可以执行它的方法。

如果你能告诉我一个更好的方法来做我正在做的事情,请继续。您不必编写任何代码,只要这个想法很棒。只是我目前做的方式很混乱,很难调试。我最终会得到多个嵌套对象,我不喜欢这样的概念。

我一直在阅读很多其他源代码,发现它也可以非常复杂。

4

1 回答 1

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方法。您可以在此处设置要在视图中使用的内容。例如...

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
        :
        :

我可以根据需要拥有尽可能多的模块,这意味着我可以通过模块和/或控制器分离功能。

我可以继续,但我是凭记忆写的,这里和那里都有一些皱纹,但希望这能让你深思。

于 2013-01-05T08:58:36.180 回答