7

首先,很抱歉这篇文章带来的任何便利,因为这是我第一次在这里发布问题,我需要更多时间来适应这个问题。

Q1。我想为前端和后端创建 2 个“主控制器” 如下所示

  • MY_Controller扩展CI_Controller
  • FrontEnd扩展MY_Controller并且所有前端控制器都将扩展FrontEnd
  • BackEnd扩展MY_Controller并且所有后端控制器都将扩展BackEnd

使用 HMVC (MX) 的最佳方法是什么?

感谢@Wesley Murch 提出将 3 个类 MY_Controller、Frontend、Backend 放入 MY_Controller.php 的想法,但我认为将每个类放在一个 php 文件中更好(更干净)。还是我错了?我正在考虑创建一个这样的结构:

  • ./core/MY_Controller.php(扩展 MX_Controller)
  • ./libraries/Backend.php(扩展 MY_Controller)
  • ./libraries/Frontend.php(扩展 MY_Controller)
  • autoload.php中自动加载后端前端
  • 所有前端控制器都将扩展前端(例如class Blog extends Frontend:)
  • 所有后端控制器都将扩展后端(例如class Admin extends Backend:)

如果不在后端/前端控制器中添加一行代码到include_oncerequire_once./libraries/Backend.php./libraries/Backend.php ,这是否可行?


Q2。如何使用 HMVC 实现多个主题?例如,在 MVC 中,我们可以有 2 个主题结构如下:

  • ./application/views/theme1 /view_files.php _
  • ./application/views/theme2 /view_files.php _

但是在 HMVC 中,视图文件夹位于单独的文件夹中,如果我想实现多个主题,通常我必须这样做:

  • ./application/modules/ module1 / views/ theme1 /view_files.php
  • ./application/modules/ module1 / views/ theme2 /view_files.php
  • ./application/modules/ module2 /views/ theme1 /view_files.php
  • ./application/modules/ module2 /views/ theme2 /view_files.php

这不是我想要的,因为我想将一个主题的所有视图文件放在一个文件夹中,然后,如果我想创建一个新主题,我只需要复制一个主题文件夹。但我想知道如何在不破坏 HMVC 模型的情况下做到这一点(因为据我所知,在 HMVC 模型中,模型、视图、控制器必须位于一个模块文件夹中 - 至少使用 CI)。这就是我陷入的冲突。

4

1 回答 1

9

只需打开或创建core/MY_Controller.php,创建一个MY_Controller类并扩展它MX_Controller,然后在同一个文件中创建您的其他基本控制器并扩展它们MY_Controller。这是一个示例,您可以复制/粘贴以帮助您入门:

<?php defined('BASEPATH') OR exit('No direct script access.');

class MY_Controller extends MX_Controller {

    public function __construct()
    {
        // do some stuff here that affects all controllers
    }

}

class Frontend_Controller extends MY_Controller {

    public function __construct()
    {
        parent::__construct();
    }

}

class Backend_Controller extends MY_Controller {

    public function __construct()
    {
        parent::__construct();
        // Check admin login, etc.
    }

}

/* end file application/core/MY_Controller.php */

就“多个主题”而言,不确定您需要什么。样式表?HTML 模板?您需要让用户切换它们还是手动进行?您是否需要检测移动设备并相应地更改主题?上述所有的?“最佳”方式将取决于您的实施。

我正在考虑创建 2 个从 MY_Controller.php 扩展的库并自动加载它们。那会奏效吗?

不知道为什么你需要或想要......只是不要这样做。您应该只使用其他控制器扩展这些类。

关于主题,我希望有多个视图主题,例如: - /views/theme1/view_files.php - /views/theme2/view_files.php 关于js/css/images,我可以自己安排。一开始我会修复主题,但稍后我可能会允许用户选择。使用 MVC,我可以将主题放在 /views/ 的子​​文件夹中,但使用 HMVC,我必须找到另一种方法将它们排列到主题中,因为视图文件夹是分开的(我希望所有相同主题的视图文件都在 1文件夹)..

由于这是一个太宽泛的问题,无法在这里解决,而且您似乎还没有尝试过任何东西,所以我将给您举一个最简单的例子:

class MY_Controller extends MX_Controller {

    public function __construct()
    {
        // do some stuff here that affects all controllers
        $this->theme = 'theme1'; // matches your directory name in /views/themes/
    }

}

从您的控制器:

$this->load->view('themes/'.$this->theme.'/my_view_file');

使用 HMVC,该文件将始终在当前模块中查找,如果不存在则回退到默认应用程序目录。如果由于某种原因您需要明确说明,您可以说在路径前加上模块名称(例如模块之间的交叉加载资源)。例子:

// From "blog" module
$this->load->view('events/index');
// We just loaded `modules/events/views/index` from the blog module

无论如何,这不是一个完整的解决方案,但希望它能让你开始一个想法。有数百万种方法可以做到这一点,这里有两个已经支持主题的模板库:

于 2011-07-22T13:40:21.150 回答