Альтернативный способ загрузки библиотек CodeIgniter, чтобы они хорошо играли с автозаполнением - PullRequest
2 голосов
/ 05 января 2012

В CodeIgniter, можно ли загружать библиотеки и модели, как показано ниже:

$my_library = new my_library();

Причина, по которой я хочу это сделать, заключается в том, что используемый мной редактор (Komodo Edit) не распознает класс дляиспользовать с автозаполнением при использовании $this->load.

Ответы [ 4 ]

4 голосов
/ 10 января 2012

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

Я понимаю, что вы имеете в виду, когда говорите, что автозаполнение не работает. Я использую NetBeans, и с этой проблемой я тоже столкнулся. Я немного покопался, и хотя для Komodo Edit это гораздо менее задокументировано, решение для правильной работы автозаполнения очень похоже на его работу с NetBeans.

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

Вот сообщение в блоге , подробно описывающее обходной путь . Идея состоит в том, что вы создаете фиктивный PHP-файл в корне вашего проекта, содержащий ряд комментариев, ссылающихся на свойства и методы основных классов CodeIgniter. Komodo Edit затем ссылается на файл и добавляет свойства и методы к его завершению кода.

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

А если вам интересно, вот сообщение в блоге , в котором подробно описывается то же решение для Netbeans .

2 голосов
/ 09 января 2012

Вот новый подход, который я пробую для моделей, использующих пространства имен (5.3+) и spl_autoload_register().Было бы не слишком сложно заставить его работать и для библиотек:

<?php

class MY_Loader extends CI_Loader {

    protected static $CI;

    public function __construct()
    {
        parent::__construct();
        self::$CI =& get_instance();
    }

    public static function autoload($class_name)
    {
        if (substr($class_name, 0, 7) == 'Models\\')
        {
            self::$CI->load->model(substr($class_name, 7));
        }
    }

    public function singleton($model_name)
    {
        if ( !class_exists('Models\\'.$model_name) || empty(self::$CI->$model_name))
        {
            $this->model($model_name);
        }

        return self::$CI->$model_name;
    }

    public function factory($model_name, $params = NULL)
    {
        if ( !class_exists('Models\\'.$model_name))
        {
            $this->model($model_name);
        }

        if (count($params) < 2)
        {
            return new self::$CI->$model_name($params);
        }
        else
        {
            $reflection_class = new ReflectionClass('Models\\'.$model_name);
            return $reflection_class->newInstanceArgs($params);
        }
    }
}

spl_autoload_register('MY_Loader::autoload');

Причины для пространств имен:

  1. Я постоянно чувствую, что хочу и того, и другого.контроллер «Учетная запись» и модель «Учетная запись», и приятно не беспокоиться о столкновениях
  2. Я автоматически знаю в своем автозагрузчике, что это модель, которая должна быть загружена, поэтому я могу безопасно просто загрузить модель иготово

Использование:

  • Вы можете просто создать экземпляр объекта, используя new ClassName() как обычно (ваша IDE должна его забрать)
  • Вы можете загрузить синглтон с помощью $this->load->singleton($class_name) - Мне все еще нужно немного поработать над этой частью, поскольку на самом деле это не было бы синглтоном, если вы автоматически загрузили первый экземпляр, а затем использовали $this->load->singleton() послетот.Эта функция в основном такая же, как $this->load->model(), но немного более информативна.
  • Вы можете загрузить фабричный экземпляр с помощью $this->load->factory($class_name, $constructor_parameters).Это хорошо, потому что вы можете связать вызовы методов и выполнить некоторую сложную загрузку базы данных в конструкторе на основе заданных параметров.
0 голосов
/ 08 января 2012

Вы пытались добавить каталог библиотеки в свойства вашего проекта?я думаю, что это может помочь http://community.activestate.com/node/7590 (я не уверен, так как я не использую komodo)

0 голосов
/ 07 января 2012

Не думаю, что вызов библиотек подобным образом сработает. Вы можете попробовать использовать функцию php include / require для ручного включения класса на страницу, что теоретически позволит вам создать экземпляр таким образом.

Простите, но я не понимаю, что вы имеете в виду, когда ваш редактор не признает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...