Создание библиотек
Когда мы используем термин “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();