10

当我问这个问题时,我太困了,很抱歉,无论如何,为了让事情清楚,我准备了 2 个小时的问题。

我正在尝试组织我的代码并决定组织它 mvc'ish(mvc-like),我不知道我是否可以遵循所有原则,但我想至少接近这一点。

我的应用程序有一个前端控制器(不知道我的定义是否正确),因此我的应用程序的所有 http 请求都将通过一个点,在我的情况下是index.php在我的应用程序的根目录中。

话虽如此,我已经这样设置了,您可以想象我曾经.htaccess将所有请求定向到index.php.

我爆炸url并从中创建了一个数组,$url[]就像这样。所以每当我像这样访问我的应用程序时,http://localhost/app/pagename它都会访问一个控制器(pagename_controller

我是这样做的:

$file = $controller_path . $page . '_controller.php';

if (file_exists($file)) {
    require $file;
    $class_name = ucfirst($page) . '_controller';
    $target = new $class_name();
}

我也将它包装在一个容器中,即“装饰器模式”,以备将来使用,也许是验证。像这样 :

$controller = new Wrap($target);
$controller->index();

我不知道$controller变量名的使用是否合适,所以如果一切都错了,请原谅我。

我有点认为我可以像这样设置我的应用程序:

  1. 用户发送请求,如何?通过使用应用程序意味着他/她发出一个http请求,这将加载应用程序的初始状态

    信用:phparchitect 设计模式

正如您在我想要的应用程序结构图中看到的那样,我只能做第一部分,即将请求定向到单个条目 ( index.php)

现在的问题是应用程序其他部分的初始化。

到目前为止,我有 3 个文件要设置,但我对如何设置感到困惑。

index_controller, index_view,Template

class Index_controller {
    private $model;
    private $view;

    public function __construct(){
        // optional model -> $this->model = 'index' 
        $this->view = 'index'  // 
    }

    public function index(){
        $this->load->view($this->view)
    }
}

class Index_view {
    private $model;
    private $template;

    public function __construct(Model $model = null){
         $this->template = new Template('default');
    }

    public function view() {
         $this->template->assign('css', 'default_css'); // don't know if this is efficient
         // or $this->template->assign('header', 'default_header');
         // or $this->template->assign('sidebar', 'default_sidebar');
         // or $this->template->assign('footer', 'default_footer');
         // or any other things I want to use in the template
    }
}

class Template {

    public $data = array();
    private $tmpl;

    public function __construct($template) {
         $this->tmpl = $template . '_tmpl.php';
    }

    public function assign($name, $value){
        $this->data[$name] = $value;
    }

    // public function output
    // function that will explode the data array and render it out as a webpage
    // I'll create templates and
}

有了这些,我现在想知道如何将这些东西联系在一起。目前我有一个system可以包含类的文件夹,我为该文件夹设置了一个自动加载器。

我正在考虑创建一个Controller类和View充当如图所示的 ActionFactory 和 ViewFactory 的类,尽管我知道这些不是他们的职责。

我在想这个:

class Controller {

    protected $load;
    public function __construct() {
        $this->load = new View();
    }
}

class View {
    public function __construct() {
    // some things i don't know
    }

    public function view() {
    // some things i don't know
    }
}

您对我的设置有什么建议和意见。如何启动三合会?

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.');
        }
    }
?>

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

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

于 2012-12-19T21:54:28.017 回答