CodeIgniter-Multiple子类前缀

时间:2014-03-07 11:10:04

标签: php codeigniter

是否可以定义多个子类前缀。现在,前缀按以下格式编写。

$config['subclass_prefix'] = "MY"; 

在这里,我可以创建自定义控制器 MY_Controller ,后面附加前缀“MY”。

这里我想创建另一个名为 MY_AdminController 的自定义控制器以及MY_Controller。在这种情况下如何定义子类前缀。

4 个答案:

答案 0 :(得分:1)

为时已晚,但对我来说正确的答案是将CI_controller或MY_controller类扩展到同一个文件中..(对不起我的英文)

application/core/MY_controller.php

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class MY_Controller extends CI_Controller {
   ...
   ...
   ...
}

class Admin_Controller extends CI_Controller{
   ...
   do what you need
   ...
}

?>

我在另一篇文章中看到了这个答案(不记得了),我解决了我的问题

答案 1 :(得分:1)

我有一些技巧。我在loading-cores上设置了新配置“config.php”。您可以随意设置配置名称。

$config['loading-cores'] = array(
    "load-my-cores" => TRUE,
    /* core class(es) to be loaded, note: must be a php file type */
    "my-cores" => ["APIResponder", "Anotherclass"]
);
  

我在核心文件夹中的课程:

     
      
  • APIResponder.php
  •   
  • Anotherclass.php
  •   

然后打开文件..system/core/CodeIgniter.php,尝试找到此代码段:

if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')){
        require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';}

在下方添加代码行以加载核心类,将其放在上面的代码段之后:

if(isset($CFG->config['loading-cores'])){
    if($CFG->config['loading-cores']['load-my-cores'] && count($CFG->config['loading-cores']['my-cores']) > 0){
        foreach ($$CFG->config['loading-cores']['my-cores'] as $core) {
            if (file_exists(APPPATH."core/{$core}.php")){
                require_once APPPATH."core/{$core}.php";
            }
        }
    }
}

如果您不需要加载核心类,请设置"load-my-cores" => FALSE

答案 2 :(得分:0)

您只能有一个前缀。

您尝试做的事情听起来像是扩展,您希望扩展现有的控制器以执行其他操作。

不要忘记控制器不仅仅是一个抽象元素,它是您正在使用的MVC框架的一部分。

'base'控制器不应该是特定的(例如,adminController),它应该尽可能通用并做'控制器'的东西(加载视图,加载所有模型等)。

假设您有一个用户控制器,一个管理员是一种用户,因此它应该扩展用户模型。这可以防止您将代码加倍,因为管理员至少应该做一些用户正在做的事情。只是一个例子。

答案 3 :(得分:0)

简答:并非没有调整核心

答案很长:您可以通过在/system/core/CodeIgniter.php中添加一个钩子来解决问题,这会在加载任何其他控制器之前加载新控制器。这是我如何做到的:

(请注意,我使用MY_Controller作为管理控制器,MY_Basecontroller作为常规控制器):

  1. 第一步 - 您将此行添加到/system/core/CodeIgniter.php, line 241 - see exactly where

    $EXT->_call_hook('pre_local_controller');
    

    您必须在加载本地控制器之前执行,否则它将无法正常工作。

  2. 第二步 - 将以下代码添加到/application/config/hooks.php

    $hook['pre_local_controller'][] = array(
                             'class'    => 'Hooks',
                             'function' => 'loadCore',
                             'filename' => 'Hooks.php',
                             'filepath' => 'hooks',
                             'params'   => 'MY_Basecontroller.php'
    );
    
  3. 第三步 - 创建一个文件/application/hooks/Hooks.php并将以下代码放入其中:

    class Hooks
    {
        public function loadCore($class)
        {
            require_once(APPPATH . 'core/' . $class);
        }
    }
    
  4. 第四步 - 利润

  5. 现在,您的课程可以从位于MY_Basecontroller的班级/application/core/MY_Basecontroller.php延伸。显然,不要忘记它应该扩展CI_Controller

    它仍然不完全是'多子类前缀' - 实际上它与它没有任何关系,但它会做你要求的。

    根据自己的喜好调整并疯狂。

    干杯。