Недавно, просматривая руководство пользователя CodeIgniter, случайно обнаружил новые для себя пункты о драйверах и их создании. Поскольку написано в них немного, я решил рассмотреть эту тему подробней.
Итак драйвер — это особый тип библиотеки, которая состоит из одного родительского класса и нескольких дочерних. Дочерние классы получают доступ только к родительскому классу, но не имеют доступа к свои собратьям. Термин «дочерний» на самом деле не наследует поля родителя, а лишь получает к ним доступ.
Драйверы служат для разбиения ваших библиотек на отдельные классы и в CodeIgniter представляют собой реализацию структурного шаблона проектирования Декоратор.
Допустим, нам необходимо создать библиотеку Connect для подключения к различным социальным сетям и получения из них каких-то данных.
В документации приводится такой пример использования:
В реальном коде это может выглядеть так:
Такой способ позволяет удобно включить множество функций в одну библиотеку с наглядной структурой.
Первое, что нужно сделать при создании драйвера, это создать структуру файлов.
В папке, где хранятся библиотеки, для каждого драйвера необходимо создать отдельную директорию с именем драйвера. В ней должен находиться родительский класс и папка drivers с дочерними. Имена файлов должны быть написаны строчными буквами, а начинаться с заглавной.
Так выглядит организация файлов драйвера:

После того, как файлы созданы, можно приступать к написанию кода. При этом важно помнить, что родительский класс вашего драйвера должен расширять CI_Driver_Library, а все дочерние CI_Driver.
Пример родительского класса драйвера:
application/libraries/Connect/Connect.php
Обязательным моментом является переменная $valid_drivers, которая представляет собой массив с именами дочерних классов.
Переменную можно объявить в конструкторе или вынести в конфигурационный файл. Для обеспечения лучшей переносимости, рекомендуется использовать конфигурационный файл.
application/config/connect.php
Как и в обычных библиотеках ссылку на объект CodeIgniter можно получить с помощью функции get_instance.
Создадим два дочерних класса:
application/libraries/Connect/drivers/Connect_twitter.php
application/libraries/Connect/drivers/Connect_facebook.php
Класс родитель имеет доступ ко всем дочерним, а дочерние только к родителю. По этому для обмена данными между дочерними классами необходимо использовать родительский класс в качестве промежуточного.
..application/controller/home.php
Приведенный пример конечно очень простой, но он показывает как можно создавать удобные библиотеки, которые можно будет использовать потом в других проектах.
Итак драйвер — это особый тип библиотеки, которая состоит из одного родительского класса и нескольких дочерних. Дочерние классы получают доступ только к родительскому классу, но не имеют доступа к свои собратьям. Термин «дочерний» на самом деле не наследует поля родителя, а лишь получает к ним доступ.
Драйверы служат для разбиения ваших библиотек на отдельные классы и в CodeIgniter представляют собой реализацию структурного шаблона проектирования Декоратор.
Допустим, нам необходимо создать библиотеку Connect для подключения к различным социальным сетям и получения из них каких-то данных.
В документации приводится такой пример использования:
$this->load->driver('some_parent');
$this->some_parent->some_method();
$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method();
В реальном коде это может выглядеть так:
$this->load->driver('connect');
$this->connect->facebook->get_friends();
$this->connect->twitter->get_twitts();
Такой способ позволяет удобно включить множество функций в одну библиотеку с наглядной структурой.
Создание драйвера
Первое, что нужно сделать при создании драйвера, это создать структуру файлов.
В папке, где хранятся библиотеки, для каждого драйвера необходимо создать отдельную директорию с именем драйвера. В ней должен находиться родительский класс и папка drivers с дочерними. Имена файлов должны быть написаны строчными буквами, а начинаться с заглавной.
Так выглядит организация файлов драйвера:

После того, как файлы созданы, можно приступать к написанию кода. При этом важно помнить, что родительский класс вашего драйвера должен расширять CI_Driver_Library, а все дочерние CI_Driver.
Пример родительского класса драйвера:
application/libraries/Connect/Connect.php
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Connect extends CI_Driver_Library
{
public $valid_drivers;
public $CI;
function __construct()
{
$this->CI = & get_instance();
$this->CI->config->load('connect', TRUE);
$this->valid_drivers = $this->CI->config->item('modules', 'connect');
}
public function get_friends()
{
return $this->twitter->get_friends() . $this->facebook->get_friends();
}
}
Обязательным моментом является переменная $valid_drivers, которая представляет собой массив с именами дочерних классов.
Переменную можно объявить в конструкторе или вынести в конфигурационный файл. Для обеспечения лучшей переносимости, рекомендуется использовать конфигурационный файл.
application/config/connect.php
<?php
$config['modules'] = array('connect_twitter', 'connect_facebook');
Как и в обычных библиотеках ссылку на объект CodeIgniter можно получить с помощью функции get_instance.
Создадим два дочерних класса:
application/libraries/Connect/drivers/Connect_twitter.php
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Connect_twitter extends CI_Driver
{
public function get_twitts()
{
return 'Мои последние твитты:';
}
public function get_friends()
{
return '@vanya, @stepa ';
}
}
application/libraries/Connect/drivers/Connect_facebook.php
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Connect_facebook extends CI_Driver
{
public function get_friends()
{
return 'Ivan, Stepan ';
}
}
Использование в контроллере
Класс родитель имеет доступ ко всем дочерним, а дочерние только к родителю. По этому для обмена данными между дочерними классами необходимо использовать родительский класс в качестве промежуточного.
..application/controller/home.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Home extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->driver('connect');
}
public function friends()
{
echo 'Мои друзья в социальных сетях: ';
echo $this->connect->get_friends();
// выведет всех друзей с обоих сайтов
}
public function twitts()
{
echo $this->connect->twitter->get_twitts();
// покажет записи из твиттера
}
}
Приведенный пример конечно очень простой, но он показывает как можно создавать удобные библиотеки, которые можно будет использовать потом в других проектах.