【问题标题】:CodeIgniter and HMVC questionsCodeIgniter 和 HMVC 问题
【发布时间】:2011-10-10 22:16:38
【问题描述】:

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

第一季度。我想为 FrontEndBackEnd 创建 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 中自动加载 BackendFrontend
  • 所有前端控制器都将扩展前端(例如:class Blog extends Frontend
  • 所有后端控制器都将扩展 Backend(例如:class Admin extends Backend

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


第二季度。如何使用 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)。这就是我陷入的冲突。

【问题讨论】:

    标签: codeigniter themes frontend backend hmvc


    【解决方案1】:

    只需打开或创建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
    

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

    【讨论】:

    • 我正在考虑创建 2 个从 MY_Controller.php 扩展的库并自动加载它们。那会奏效吗?关于主题,我想为视图有多个主题,例如: - /views/theme1/view_files.php - /views/theme2/view_files.php 关于 js/css /images,我可以自己安排。一开始我会修复主题,但稍后我可能会允许用户选择。使用 MVC,我可以像上面一样将主题放在 /views/ 的子文件夹中,但是使用 HMVC,我必须找到另一种方法将它们排列到主题中,因为视图文件夹是分开的(我想要相同的主题将仅在 1 个文件夹中)..
    • 对不起,我忘了说不是在 1 个文件中创建 2 个类,我想创建 2 个库后端和前端从 MY_Controller 扩展并在配置文件中自动加载后端和前端。然后在控制器中,我将扩展为:class Blog extends Frontend
    • 关于主题,因为在 HMVC 模型中,视图文件夹位于单独的模块文件夹中,这就是我坚持将它们分组到 1 个主题文件夹中的原因。根据您的建议,theme1 是在 /application/views/ 中还是在 /application/modules/module1/views/ 中?如果它在 /application/views/ 里面,它们的 HMVC 模型就会被破坏,对吧?但是如果它在 /application/modules/module1/views/ 那么如何将一个主题的所有视图文件分组到 1 个文件夹中(然后如果我想创建一个新主题,我只需要复制那个文件夹)?
    • 这很不寻常。我发布的(常用)方法有什么问题?另外,请通过editing 澄清问题,而不是发布 cmets。例如,我可以删除我的答案,没有人会看到你的更新。另外,你在这里问了两个非常不相关的问题,最好把它们分开两个。
    • 对不起,我点击了upvote箭头,但不允许这样做,因为我只有6分。我刚刚更新了我的帖子作为您的建议。非常感谢您对我的帮助。我绝对发现您的回答对我澄清创建后端和前端主控制器非常有帮助。我唯一遇到的问题是将视图文件组织到一个主题文件夹中,而不会破坏 HMVC 模型的概念(每个 MVC 三角形必须作为一个小系统隔离)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多