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

Когда мы используем термин “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_ поэтому НЕ ИСПОЛЬЗУЙТЕ его как свой префикс.