ci驱动扩展易吗_聊codeigniter自定义驱动编写法【驱动】

CodeIgniter 3 的 driver 机制是基于命名约定和 CI_Driver_Library 的类代理模式,并非真正可热插拔的插件系统;它硬编码扫描 drivers/ 目录、要求严格命名(如 redis.php → Redis 类)、依赖手动维护 $valid_drivers 数组,且不支持 Composer 或 PSR-4 动态加载。

ci驱动扩展易吗_聊codeigniter自定义驱动编写法【驱动】

CodeIgniter 3 的 driver 扩展机制本质是伪驱动,不是真插件系统

CI 3 的 driver 并非运行时动态加载或可热插拔的驱动架构,而是一套基于命名约定 + CI_Driver_Library 的类代理模式。它要求你把所有子驱动放在固定目录(libraries/Your_driver_name/drivers/),且必须继承 CI_Driver,父类库本身得继承 CI_Driver_Library。这意味着:它不支持 Composer 自动发现、不支持 PSR-4 动态映射、也不允许在运行时注册新驱动类型。

常见误判是以为加个新 .php 文件就能“启用驱动”——实际会报 Class 'CI_Driver_XXX' not foundInvalid driver: XXX,因为 CI 在初始化时就硬编码扫描了 drivers/ 子目录,并只认特定命名格式。

  • 驱动类文件名必须全小写,如 redis.php,对应类名必须是 Redis(首字母大写,无下划线)
  • 父库类名必须是 Your_driver_name,且文件放在 libraries/Your_driver_name.php
  • 子驱动类必须声明 public $valid_drivers = ['redis', 'file', 'memcached'];,拼写必须和文件名完全一致
  • CI 不会自动 require_once 驱动文件,而是用 class_exists() 检查后反射调用,所以类定义必须已加载(通常靠 APPPATH.'libraries/...' 路径下的 require 或 autoloader)

如何让自定义驱动被 $this->load->driver('cache') 正确识别

以扩展 cache 驱动为例,你要新增一个 apc 子驱动,但 CI 原生 Cache 库默认只认 filememcachedredisapc(注意:CI 3.1.11+ 才内置 apc,旧版需手动补)。

若你用的是老版本 CI,或想加一个叫 xxl 的新驱动,不能只放 drivers/xxl.php 就完事——你还得改父库源码或重载它:

Evoker

Evoker

一站式AI创作平台

下载

  • 复制 system/libraries/Cache/Cache.phpapplication/libraries/Cache.php
  • Cache 类中覆盖 $valid_drivers,追加 'xxl'
  • 确保 application/libraries/Cache/drivers/Xxl.php 存在,且类名为 Xxl
  • Xxl.php 中实现 __construct()get()save() 等必需方法(CI 会检查这些方法是否存在)
class Xxl extends CI_Driver {
    public function __construct()
    {
        // 必须有构造函数,哪怕空着
    }

    public function get($id)
    {
        return apcu_fetch($id);
    }

    public function save($id, $data, $ttl = 60)
    {
        return apcu_store($id, $data, $ttl);
    }
}

driver 加载失败的三个典型错误和对应检查点

报错往往不直接说“哪错了”,而是抛出模糊异常,比如 Call to a member function get() on nullInvalid driver: redis。根源基本在这三处:

  • application/libraries/Cache.php 里没定义 public $valid_drivers = [...];,或者数组里写了 'Redis'(驼峰)但文件名是 redis.php(小写)
  • 子驱动类没继承 CI_Driver,或类名与文件名不匹配(drivers/redis.php → 类必须叫 Redis,不能叫 Cache_redis
  • 子驱动方法缺失:CI 在实例化驱动前会用 method_exists($driver, 'get') 等校验,缺任何一个就会跳过该驱动并静默忽略(不会报错,但后续调用就 null

CI 4 已彻底弃用 driver,别再往老机制里堆逻辑

CI 4 完全移除了 CI_Driver_Librarydrivers/ 目录约定,转而用标准 PSR-4 + 依赖注入(DI)容器管理服务。比如缓存直接用 /CodeIgniter/Cache/CacheInterface 实现类,通过 Services::cache() 获取,可自由绑定任意实现(FileHandlerRedisHandler、甚至你自己写的 MySqlCacheHandler)。

如果你还在维护 CI 3 项目,驱动扩展是可行的,但务必接受它的硬编码限制;如果新项目或可升级,别花时间封装 CI 3 驱动——直接迁到 CI 4,或用 Laravel 的 CacheManager、Symfony Cache 组件更省心。CI 3 的驱动机制,本质上是为简化几个内置场景设计的胶水代码,不是通用扩展框架。

https://www.php.cn/faq/1993095.html

发表回复

Your email address will not be published. Required fields are marked *