CodeIgniter和HMVC问题

Mic*_*Bui 7 frontend themes codeigniter backend hmvc

首先,对于这篇文章造成的任何便利感到抱歉,因为这是我第一次在这里发帖,我需要更多的时间来适应这个.

Q1.我想为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中自动加载后端前端
  • 所有前端控制器将延伸前端(如: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/ 模块1 /视图/ THEME1 /view_files.php
  • ./application/modules/ 模块1 /视图/ THEME2 /view_files.php
  • ./application/modules/ module2/views/theme1 /view_files.php
  • ./application/modules/ module2/views/theme2 /view_files.php

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

Wes*_*rch 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 */
Run Code Online (Sandbox Code Playgroud)

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

我正在考虑从MY_Controller.php创建2个库并自动加载它们.那会有用吗?

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

关于主题,我希望有多个主题的视图,如: - /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/
    }

}
Run Code Online (Sandbox Code Playgroud)

从您的控制器:

$this->load->view('themes/'.$this->theme.'/my_view_file');
Run Code Online (Sandbox Code Playgroud)

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

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

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