Создание библиотек

    Когда мы используем термин “Libraries” мы, как правило, ссылаемся на классы которые находятся в папке с библиотеками и описанные в классе ведения данного руководства пользователя. Однако, вместо этого мы опишем, как Вы можете создать свои собственные библиотеки в application/libraries в целях поддержания разделения между Вашим ресурсам и ресурсами фреймворка.

    В качестве дополнительного бонуса, CodeIgniter позволяет расширять библиотеки родных классов, если просто нужно добавить некоторые функции в существующую библиотеку. Или же можете заменить родные библиотеки, просто поместив свою версию с одинаковыми именами в application/libraries каталог.

    В сумме:

    • Вы можете создавать полностью новые библиотеки.
    • Вы можете расширить родные библиотеки.
    • Вы можете заменить родные библиотеки.

    На странице ниже приведено описание этих трех понятий в деталях

    Примечание

    Класс базы данных не может быть расширен или заменен на собственный класс. Все другие классы могут быть заменены/расширены.

    Хранение

    Библиотеки классов должны быть размещены в пределах application/libraries каталога, как это у CodeIgniter и где он будет искать их, когда они инициализируются.

    Работа с именами

    • Имена файлов должны начитнаться с большой буквы. Например: Myclass.php
    • Имена классов должны начитнаться с большой буквы. Например: class Myclass
    • Имена классов и имена файлов должны совпадать.

    Файл класса

    Классы должны иметь этот базовый прототип:

    php
    defined('BASEPATH') OR exit('No direct script access allowed');
    
    class Someclass {
    
    	public function some_method()
    	{
    	}
    }
    

    Примечание

    Мы используем имя Someclass чисто как пример.

    Используем свой класс

    Любой метод класса контроллера может быть инициализирован следующим способом:

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

    Где someclassимя файла, без ”.php” расширения. Вы можете передать имя файла с большой или маленькой буквы. CodeIgniter все равно.

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

    $this->someclass->some_method();  // Object instances will always be lower case
    

    Передача параметров при инициализации своего класса

    В библиотеке в способ загрузки можно динамически передавать данные в виде массива через второй параметр, который будет передан в конструктор класса:

    $params = array('type' => 'large', 'color' => 'red');
    
    $this->load->library('someclass', $params);
    

    Если используете эту функцию, Вы должны настроить конструктор класса, чтобы получить данные:

    php defined('BASEPATH') OR exit('No direct script access allowed');
    
    class Someclass {
    
    	public function __construct($params)
    	{
    		// Do something with $params
    	}
    }
    

    Вы можете также передавать параметры через файл конфигурации. Просто создайте конфигурационный файл с именем как у класса и сохраняет его в application/config/ папку. Обратите внимание, при динамической передаче параметров, как описано выше, файл конфигурации параметров не будет доступен.

    Используем ресурсы CodeIgniter со своими библиотеками

    Для доступа к родным ресурсам CodeIgniter внутри своей библиотеки используйте get_instance() метод. Этот метод возвращает в CodeIgniter супер объект.

    Обычно внутри методов контроллера, используется для вызова переменной $this конструкция:

    $this->load->helper('url');
    $this->load->library('session');
    $this->config->item('base_url');
    // etc.
    

    $this, однако, работает только непосредственно в своих контроллерах, моделях или видах. Если вы хотите использовать классы CodeIgniter внутри собственных классов, Вы можете сделать это следующим образом:

    Во-первых, назначить CodeIgniter объект переменной:

    $CI =& get_instance();
    

    Как только Вы присвоили объект переменной, Вы будете использовать эту переменную вместо этой $this:

    $CI =& get_instance();
    
    $CI->load->helper('url');
    $CI->load->library('session');
    $CI->config->item('base_url');
    // etc.
    

    Примечание

    Вы заметили, что выше get_instance() функция передается по ссылке:

    $CI =& get_instance();
    

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

    Так как, библиотека является классом, было бы лучше воспользоваться принципами ООП в полной мере. Итак, для того, чтобы использовать супер объект CodeIgniter во всех методах класса, будет предложено присвоить его свойству:

    class Example_library {
    
    	protected $CI;
    
    	// We'll use a constructor, as you can't directly call a function
    	// from a property definition.
    	public function __construct()
    	{
    		// Assign the CodeIgniter super-object
    		$this->CI =& get_instance();
    	}
    
    	public function foo()
    	{
    		$this->CI->load->helper('url');
    		redirect();
    	}
    
    	public function bar()
    	{
    		echo $this->CI->config->item('base_url');
    	}
    
    }
    

    Замена родных библиотек Вашими

    Просто назывите свой класс идентично файлам родной библиотеки и CodeIgniter будет использовать ее вместо родной. Для использования этой функции необходимо задать имя файла и класса точно такими же, как в родной библиотеке. Например, чтобы заменить родную библиотеку Email создадите файл с именем application/libraries/Email.php, и объявить свой класс:

    class CI_Email {
    
    }
    

    Обратите внимание, что большинство родных классов имеют префикс CI_.

    Чтобы загрузить библиотеку, используйте стандартный способ загрузки:

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

    Примечание

    В настоящее время классы баз данных не могут быть заменены на собственные.

    Расширяем собственные библиотеки

    Если все, что нужно сделать, это добавить некоторую функциональность к уже существующей библиотеке - возможно добавить метод или два - тогда замена библиотеки на собственную чрезмерна. В этом случае лучше просто расширить класс. Расширение класса практически идентично замене класса с парой исключений:

    • Объявление класса должно расширять родительский класс.
    • Ваше новое имя класса и имя файла должны иметь префикс MY_ (этот элемент конфигурируется. См. ниже.).

    Например, чтобы расширить родной класс Email создайте файл с именем application/libraries/MY_Email.php, и объявить свой класс:

    class MY_Email extends CI_Email {
    
    }
    

    Если вам нужно использовать конструктор в классе, убедитесь, что Вы расширили родительский конструктор:

    class MY_Email extends CI_Email {
    
    	public function __construct($config = array())
    	{
                    parent::__construct($config);
    	}
    
    }
    

    Примечание

    Не все библиотеки имеют одинаковые (или некоторые) параметры в конструкторе. Посмотрите на библиотеку, которую Вы расширяете прежде чем она будет реализована.

    Загрузка своего суб-класса

    Чтобы загрузить ваш суб-класс используйте стандартный синтаксис. НЕ УКАЗЫВАЙТЕ префикс. Например, для загрузки в примере выше, который расширяет класс электронной почты, Вы будете использовать:

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

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

    $this->email->some_method();
    

    Установка своего префикса

    Чтобы установить свой собственный префикс, откройте application/config/config.php файл и найдите в нем:

    $config['subclass_prefix'] = 'MY_';
    

    Обратите внимание, что все родные библиотеки CodeIgniter имеют префикс CI_ поэтому НЕ ИСПОЛЬЗУЙТЕ его как свой префикс.