CodeIgniter和HMVC问题

7

首先,对于此帖子可能造成的任何不便我们深表道歉,因为这是我第一次在这里发布问题,我需要更多时间来适应。

问题1:我想创建两个像这样的“主控制器”用于FrontEndBackEnd

  • 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中自动加载 BackendFrontend
  • 所有前端控制器都将扩展Frontend(例如:class Blog extends Frontend
  • 所有后端控制器都将扩展Backend(例如:class Admin extends Backend

这样做是否能够在backend/frontend控制器中不多加一行代码的情况下正常工作,无需include_oncerequire_once./libraries/Backend.php./libraries/Backend.php


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

  • ./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中是这样)。这就是我卡住的冲突。

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,我必须找到另一种方法将它们排列到主题中,因为视图文件夹是分开的(我希望同一主题的所有视图文件都在一个文件夹中)。
由于这是一个过于广泛的问题,无法在此处解决,而且您似乎甚至没有尝试过任何东西,我将给您提供一个最基本的示例:
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

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

我在考虑创建两个扩展自MY_Controller.php的库并且自动加载它们。这样行得通吗? 关于主题,我想拥有多个视图主题,例如:
  • /views/theme1/view_files.php
  • /views/theme2/view_files.php
至于 js/css/images,我可以自己去安排。 一开始我会固定主题,但以后可能允许用户进行选择。使用MVC,我可以将主题放在**/views/**子文件夹中,如上所示;但是使用HMVC,我必须找到另一种方法来安排主题,因为视图文件夹是分开的(我希望所有相同主题的视图文件都在同一个文件夹中)。
- Michael Bui
抱歉,我忘了提到,我想创建两个库Backend和Frontend,它们都继承自MY_Controller,并在配置文件中自动加载Backend和Frontend。然后在控制器中,我将像这样进行扩展:class Blog extends Frontend - Michael Bui
关于主题,因为在HMVC模型中,视图文件夹位于分离的模块文件夹中,这就是我无法将它们分组到一个主题文件夹中的原因。根据您的建议,theme1是在 /application/views/ 中还是在 /application/modules/module1/views/ 中?如果它在 /application/views/ 中,那么HMVC模型将会被破坏,对吧?但是,如果它在 /application/modules/module1/views/ 中,那么如何将所有主题的视图文件组合成一个文件夹(然后如果我想创建一个新主题,我只需要复制那个文件夹)? - Michael Bui
这非常不寻常。我发布的(通用)方法有什么问题吗?此外,请通过编辑来澄清问题,而不是发表评论。例如,我可以删除我的回答,然后没有人会看到您的更新。另外,你在这里问了两个非常不相关的问题,最好将它们分成两个单独的问题。 - Wesley Murch
非常抱歉,我点击了点赞箭头,但由于我只有6个积分,所以不允许。我已经根据您的建议更新了我的帖子。非常感谢您的帮助。我确实发现您的答案对我澄清创建后端和前端主控制器非常有帮助。唯一困扰我的是如何将视图文件组织到一个主题文件夹中,而不破坏HMVC模型的概念(每个MVC三角形必须作为一个小系统隔离)。 - Michael Bui
我的建议是:花些时间研究主题,如果遇到困难 - 在这里提出一个新问题,并给出具体细节。把两个无关的问题挤在一起是不明智的。 - Wesley Murch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接