Конфликт между функциями Codeigniter AUtoload и Flourish Autoload - PullRequest
1 голос
/ 29 сентября 2010

Я занимаюсь разработкой веб-приложения с использованием инфраструктуры Codeigniter (http://codeigniter.com/) и библиотеки Flourish ( unframework ) (http://flourishlib.com/).

Я просто поместил папку flourish в свое приложение, затем создал инициализацию и конфигурационные файлы flourish в соответствии с инструкциями (они создают автозагрузку Flourish).

Это моя структура папок:

--- auxcode \
-------- init.php
-------- config.php
-------- процветать \
--- система \
--- приложение \
--- public_html \

Файл инициализации включает в себя ТОЛЬКО файл конфигурации и содержимое файла конфигурации, показанное ниже:

function __autoload($class_name){

{
    // Customize this to your root Flourish directory
    $flourish_root = $_SERVER['DOCUMENT_ROOT'] . '/../auxcode/flourish/';

$file = $flourish_root . $class_name . '.php';

if (file_exists($file)) {
    include $file;
    return;
}

throw new Exception('The class ' . $class_name . ' could not be loaded');

}

В public_html к индексному файлу добавляется следующее:

<?php include_once($_SERVER['DOCUMENT_ROOT'] . '/../inc/init.php');

Теперь соответствующие функции автозагрузки (поскольку у каждой есть свои) конфликтуют. Приложение работает только тогда, когда я закомментирую функции автозагрузки (и их зависимые элементы) в любой среде.

Пожалуйста, как мне объединить функции автозагрузки, чтобы я мог получить доступ к CI и работать одинаково?

Или, если есть лучший способ использовать обе системы в одном приложении? Молись, скажи.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 01 октября 2010

Я автор Flourish. Пример автозагрузчика, который я предоставляю на начальной странице, должен помочь людям встать и начать работать, если у них уже нет среды.

В вашем случае, поскольку у вас несколько библиотек, я бы рекомендовал использовать spl_autoload_register () . Вы можете зарегистрировать автозагрузчик CI, а затем зарегистрировать свой Flourish.

2 голосов
/ 29 сентября 2010

Создание пользовательской функции __autoload. Переименуйте оригинал CI в __autoload_ci и Flourish __autoload_flourish.

Важно добавить return true; к обоим исходным автозагрузчикам, когда они были успешными. Удалите все ошибки / исключения. Затем разверните пользовательскую оболочку:

 function __autoload($class) {
     __autoload_ci($class) || __autoload_flourish($class);
 }

Или используйте spl_autoload_register

1 голос
/ 04 октября 2010

Благодаря http://codeigniter.com/forums/viewthread/73804/#366081 и некоторым битам информации от некоторых сотрудников CI, которым я следую в твиттере (я спросил их): Эрик Барнс , Дэн Хорриган , Фил Осетрина и Зак Кицмиллер , я нашел решение. Если вы такой же CodeIgniter n00b, как я, вы можете следовать за этими парнями.

Я удалил init.php и config.php, затем вставил следующее в нижнюю часть config.php моего CI (я также автоматически загружаюсь из пользовательской библиотеки mylibrary).

function multi_auto_require($class) {
if(stripos($class, 'CI') === FALSE && stripos($class, 'PEAR') === FALSE) {
    foreach (array('flourish', 'mylibrary') as $folder){
        if (is_file(APPPATH."../auxengines/{$folder}/{$class}.php")){
            include_once APPPATH."../auxengines/{$folder}/{$class}.php";
        }
    }
}
}

spl_autoload_register ( 'multi_auto_require');

Работает великолепно. Спасибо, люди!

...