Codeigniter with PEAR


    В этой статье я расскажу как подключить библиотеки PEAR в Фреймворк Codeigniter. Если PEAR установлен в системе по умолчанию и у вас есть доступ для инсталляции отдельных библиотек, то все просто. Иначе приходится подключать все ручками. Сразу приведу ссылку на источник: codeigniter.com/wiki/PEAR_integration. Ниже я перевел это руководство, в код добавил некоторые, по моему мнению, исправления.


    1. Подготовка
    Для использования библиотек PEAR Вам необходимо создать новую директорию.
    system/application/pear
    Далее скопировать PEAR.php в эту директорию
    system/application/pear/PEAR.php
    Затем скопировать необходимые библиотеки. Обратите внимание на зависимости библиотек.
    Пример:
    system/application/pear/HTTP/Request.php
    system/application/pear/Net/Socket.php
    system/application/pear/Net/URL.php


    2. Подключаем Hooks

    Заметка: Необходимо добавить путь к библиотекам PEAR в include_path. В качестве альтернативы описанного ниже способы можно вставить функцию ini_set() в Ваш config.php или в главный CI index.php файл.

    Вам необходимо включить использование hooks в config.php.
    $config['enable_hooks'] = TRUE;
    Далее откройте hooks.php и добавьте следующий hook:
    $hook['pre_controller'][] = array(
      'class' => 'Pear_hook',
      'function' => 'index',
      'filename' => 'pear_hook.php',
      'filepath' => 'hooks'
    );


    Затем создаем новый файл pear_hook.php.
    system/application/hooks/pear_hook.php
    Пишем туда.
    <?php
    if (!defined('BASEPATH')) exit('No direct script access allowed');

    class Pear_hook{
      function index(){
      // OS independent
      ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.BASEPATH.'application/pear/');
      // on Apache
      // ini_set('include_path',ini_get('include_path').':'.BASEPATH.'application/pear/');
      // on Windows
      // ini_set('include_path',ini_get('include_path').';'.BASEPATH.'application/pear/');
      }
    }

    ?>


    3. Создаем класс PearLoader.

    system/application/libraries/Pearloader.php:

    <?php

    class Pearloader {
        function load($package, $class = NULL, $options = NULL) {
        if (is_null($class)) {
            require_once $package . '.php';
            $classname = $package;
        } else {
            require_once $package . '/' . $class . '.php';
            $classname = $package . '_' . $class;
        }
        if (($count = func_num_args()) > 2) {
            $params = '';
            for ($i = 2; $i < $count; $i++) {
              eval("\$var$i = func_get_arg($i);");
              $params .= "\$var$i" . (($i + 1 == $count) ? '' : ', ');
            }
            eval("\$instance = new $classname($params);");
            return $instance;
        } else {
          return new $classname();
        }
        }
    }

    ?>


    Это все!

    Вы можете использовать Pearloader в стиле Codeigniter. Вначале загружаем библиотеку и вызываем метод load:
    $this->pearloader->load(’Packagename‘,’Classname‘);

    Например, ниже написан запрос к yahoo.

    function example(){
      $url = 'http://www.yahoo.com';
      $this->load->library('pearloader');
      $http_request = $this->pearloader->load('HTTP','Request');
      $http_request->setURL($url);
      $http_request->sendRequest();
      echo $http_request->getResponseBody();
    }
    Поделиться публикацией

    Комментарии 18

      0
      интересно, нужно будет попробывать :)
        +2
        респект
          0
          пасиб
          0
          Тэги запятыми раздели.
            0
            спасибо большое!
            теги, наверное, стоит разделить запятыми?
              –3
              Когда в Виллабаджо используют Gems/Maven, в Вилларибо всё продолжают копировать файлы.
                0
                нет, я конечно всё понимаю, но если вы на рельсах, то зачем вы пишите комментраии в блог пхп фреймворка, или это вы так мягко напоминаете пхпшникам о существовании других языков/технологий ))
                0
                Ваши теги сломали хабр :)
                Теперь в облаке тэгов «Codeigniter php pear» имеет класс w10, а все остальные — w1 или w2.
                  0
                  Habrahabr hacked by t1myrkq :)
                    0
                    Уже починили.
                  –7
                  тупость.
                    0
                    аргуманты?
                      0
                      *аргументы
                        0
                        зачем городить какойто класc для прелоада и создавать объект через eval.
                        когда можно просто написать например так:

                        require_once(«DB.php»);
                        $db = DB:: factory(«...»);

                        добавив пути соответсвенно

                          0
                          Этот код тогда делается 1ой строчкой, становится более читабельный…
                    0
                    код подразумевает одноуровневую вложенность, в случае, например, с пэкеджем Spreadsheet_Excel_Writer — не работает
                      0
                      у этого решения два минуса:
                      • Невозможность загрузить неодноуровневую библиотеку (к примеру XML_Feed_Parser)
                        0
                        недописал — отправилось:
                        — Невозможность загрузить неодноуровневую библиотеку (к примеру XML_Feed_Parser)
                        — Использование eval при инстанцировании
                        — Имя библиотеки разбито на две части — то есть в для вызова XML_RSS надо писать pearloader('XML', 'RSS'), почему нельзя сразу pearloader('XML_RSS') и опять же для нескольких уровней не прокатит.

                        Мой вариант:
                        class Pearloader {
                            function load($package) {
                        	// parse package
                        	$parse = explode('_', $package);
                        	
                        	// class filename
                        	$class = $parse[count($parse)-1];
                        	
                        	// dir with class
                        	unset($parse[count($parse)-1]);
                        	$dir = implode('/', $parse);
                        	
                        	//die($dir);
                        	
                            require_once $dir. '/'. $class. '.php';
                        	
                        	$args = func_get_args();
                        	
                            return call_user_func_array(
                                array(new ReflectionClass($package), 'newInstance'),
                                 array_slice($args, 1)
                            );
                            }
                        }
                        


                        Отдельным файлом

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.