Автозагрузчик PHP AWS SDK конфликтует с Codeigniter - PullRequest
2 голосов
/ 02 марта 2012
  • Я использую Codeigniter 2.1.0.
  • Я включаю SDK Amazon Web Services в пользовательскую модель, используя 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 SDK (точный метод CFLoader::autoloader).

Я могу обойти это, сказав class_exists не загружать автоматически, так как кажется, что DB_cache.php все равно включен, если class_exists возвращает false:

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

Это грязное исправлениеработает, но, очевидно, только исправляет непосредственную проблему.В общем, как лучше всего убедиться, что CodeIgniter не будет перепутан с автозагрузкой из других библиотек?

Пожалуйста, обратите внимание:

  • Я читал биты об использовании spl_autoload_register.Кажется, что Codeigniter не использует это, и я не уверен, как мне следует реализовать это безопасно.Я нашел бы хороший пример того, как и где мне следует реализовать это наиболее полезно (если, конечно, это решение).
  • Похоже, что AWS SDK уже использует spl_autoload_register: spl_autoload_register(array('CFLoader', 'autoloader'));

1 Ответ

4 голосов
/ 11 января 2013

Как вы, наверное, знаете, вы на самом деле не хотите модифицировать основные методы в 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();

Вы можете использовать тот же метод для любой сторонней библиотеки классов или даже для той, которую вы написали сами. Очень похожая схема может быть использована для моделей, библиотек, помощников и тому подобного. Надеюсь, это поможет!

...