Создание библиотек
Когда мы используем термин «Библиотеки», мы обычно имеем в виду классы, расположенные в директории 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(). Этот метод возвращает объект super-объекта CodeIgniter.
Обычно из методов контроллеров вы вызываете любые доступные методы 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);
// Your own constructor code
}
}
Примечание
Не все библиотеки имеют одинаковые (или вообще какие-либо) параметры в конструкторе. Сначала ознакомьтесь с библиотекой, которую вы расширяете, чтобы понять, как это реализовать.
Загрузка вашего подкласса
Для загрузки вашего подкласса вы будете использовать стандартную синтаксическую конструкцию, обычно используемую. НЕ включайте ваш префикс. Например, для загрузки приведенного выше примера, который расширяет класс Email, вы будете использовать:
$this->load->library('email');
После загрузки вы будете использовать переменную класса так, как обычно используется для класса, который вы расширяете. В случае с классом email все вызовы будут использовать:
$this->email->some_method();
Установка собственного префикса
Чтобы установить собственный префикс подкласса, откройте файл application/config/config.php и найдите этот пункт:
$config['subclass_prefix'] = 'MY_';
Обратите внимание, что все родные библиотеки CodeIgniter имеют префикс CI_, поэтому НЕ используйте его в качестве своего префикса.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/general/creating_libraries.html