繁体   English   中英

PHP AWS SDK自动加载器与Codeigniter冲突

[英]PHP AWS SDK autoloader conflicts with Codeigniter

  • 我正在使用Codeigniter 2.1.0。
  • 我使用require_once APPPATH . "/libraries/aws_sdk/sdk.class.php";将Amazon Web Services SDK包含在自定义模型中require_once APPPATH . "/libraries/aws_sdk/sdk.class.php"; require_once APPPATH . "/libraries/aws_sdk/sdk.class.php";

这很好。 但是,当CI决定以后需要加载它的数据库缓存类时,它将调用(通过CI_DB_driver :: _ cache_init):

if ( ! class_exists('CI_DB_Cache'))
{
    if ( ! @include(BASEPATH.'database/DB_cache.php'))
    {
        return $this->cache_off();
    }
}

这将触发AWS开发工具包的自动加载(确切的方法是CFLoader::autoloader )。

我可以通过告诉class_exists不要自动加载来解决此问题,因为如果class_exists返回false,则无论如何都包含DB_cache.php:

if ( ! class_exists('CI_DB_Cache', false))
{
    if ( ! @include(BASEPATH.'database/DB_cache.php'))
    {
        return $this->cache_off();
    }
}

此肮脏的修复程序有效,但显然只能解决紧迫的问题。 通常,确保CodeIgniter不会与其他库的自动加载混淆的最佳方法是什么?

请注意:

  • 我已经阅读了有关使用spl_autoload_register 似乎Codeigniter并未使用此功能,而且我不确定如何安全地实现此功能。 我将找到一个可靠的示例,说明如何以及在何处实施此最有用的方法(当然,如果这是解决方案)。
  • 看来AWS开发工具包已使用spl_autoload_registerspl_autoload_register(array('CFLoader', 'autoloader'));

如您所知,您实际上并不想修改CI中的核心方法。 因此,为防止CI与您的班级发生冲突,您需要执行以下操作:

保持文件夹结构不变,但是 aws_sdk文件夹之外创建一个新文件。 将其命名为* Aws_loader *或对您有意义的名称。 如果要自动加载sdk,请在CI自动加载器文件中添加:

CI自动加载文件(application / config / autoload.php):

$autoload['libraries'] = array('Aws_loader');

您的初始化文件:

class CI_Aws_sdk{
    // for use with PHP < version 5
    /*public function CI_Aws_sdk(){
        require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php';
    }*/

    // for use with PHP >= 5
    public function __construct(){
        require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php';
    }
}

所以您的目录结构现在看起来像这样:

application --
  config --
  ...
  libraries --
    Aws_loader.php
    aws_sdk --
       sdk.class.php

如果您没有自动加载sdk,则可以在控制器中执行以下操作:

$this->load->library('Aws_loader');

无论哪种方式,CI都会为您加载该类并有效地分离其中的任何方法,现在您可以像之前已加载的任何其他库或模型一样在该类中进行操作,而不会干扰CI的方法,类似于此:

$this->Aws_loader->do_something();

您可以对任何第三方类库甚至您自己编写的库使用相同的方法。 可以将非常相似的布置用于模型,库,助手等。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM