【问题标题】:creating a core class that extends another core class codeigniter [duplicate]创建一个扩展另一个核心类codeigniter的核心类[重复]
【发布时间】:2014-03-06 22:45:37
【问题描述】:
class Settings extends USER_Controller {...}

class USER_Controller extends MY_Controller {...}//limit access to user and define some params and functions that is user depended

class MY_Controller extends CI_Controller {...}//provide extra functionality accross all controllers

如果我尝试创建以上 3 个类,这将不起作用。

但是,如果我只使用settings extends MY_Controller,它会正常工作。

那么有没有办法在我的控制器和 MY_Controller(扩展 CI_Controller 的基本控制器)之间放置一个中间类?

【问题讨论】:

  • 您是如何扩展核心类的?你使用了不同的文件吗?
  • 即使标记为重复,这里接受的解决方案也远远好于“原始”问题中提出的所有其他解决方案。

标签: php codeigniter codeigniter-2 codeigniter-3


【解决方案1】:

正如 @Minhaz Ahmed 所说,问题在于加载类。 Codeigniter 只加载带有子类前缀的类,如

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php#L276

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

因此,经过一番挖掘,我为我的项目提供了一个解决方案,该解决方案同时使用了 codeigniter hooksspl_​autoload_​register(),而无需破解 CORE。请按照步骤来实现THE QUESTION中的内容。

  1. 如果尚未在配置文件中启用挂钩。

  2. 在 application/config/hooks.php 中创建一个钩子,如下所示。

    $hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );

  3. application/hooks 文件夹中创建 autoload.php

  4. autoload.php 文件中,

    function autoload() { spl_autoload_register(function($class) { if(strpos($class,'CI_') !== 0 && file_exists(APPPATH.'core/'.$class.EXT)) { require_once APPPATH . 'core/' . $class . EXT; } }); }

就是这样。

注意:在这里,我使用了 pre_system 钩子,而不是 pre_controller,因为 codeigniter 在pre_systempre_controller 挂钩。

希望这会有所帮助。如果对此有任何问题,请执行 cmets。

【讨论】:

  • 代码不错,谢谢分享
  • 你试过 CI 3.0.3 吗?它在 CI 3.0.3 中不起作用
  • 没有人.. 对不起.. 我与 CI 脱节.. 移动了 Laravel ;)
【解决方案2】:

CI 2.1.4 的最佳工作是什么:
应用程序/核心

例如创建:
- base_controller(基本指令,从 ci_controller 扩展)
- admin_controller(从基本控制器扩展并添加身份验证指令)


然后在应用程序/控制器中使用它们:
例如:
类用户扩展了 admin_controller...

【讨论】:

    【解决方案3】:

    你可以按照你想要的方式扩展类,但问题是加载类,你必须包含你的USER_Controller你的Settings类。问题不是扩展问题是包含文件,所以你必须找到一种方法来包含第二个类。

    http://www.php.net/manual/en/function.spl-autoload.php

    【讨论】:

      【解决方案4】:

      将 user_controller 类文件放在 MY_Controller.php 的末尾

      /application/core/中的MY_Controller.php

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

      现在从控制器文件夹中的控制器中,您可以从 USER_Controller 扩展控制器:

       class Settings extends USER_Controller {...}
      

      【讨论】:

        【解决方案5】:

        您可以使用 Phil 的核心解决方案,它简单易用。

        http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

        【讨论】:

        • 使用 Phil 解决方案,您只能定义一个自动加载。检查php.net//manual/en/function.spl-autoload-register.php
        • 如果你想要另一个核心类,你可以互相扩展所有类。那么基本上是基于此的面向对象的思想?
        • 是的,问题不在于扩展它,问题在于当类没有通过 include/require 直接包含在您的代码中时,您的 PHP 文件如何找到这些类。 __autoload 定义了如何做,但是使用 spl_autoload_register 你可以定义多个函数,以防它在 autolad 中找不到,也没有被包含
        猜你喜欢
        • 2023-03-12
        • 1970-01-01
        • 2014-03-22
        • 2013-08-14
        • 2015-12-03
        • 2012-09-26
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        相关资源
        最近更新 更多