Pull to refresh

Использование драйверов в CodeIgniter

Reading time3 min
Views4.1K
Недавно, просматривая руководство пользователя CodeIgniter, случайно обнаружил новые для себя пункты о драйверах и их создании. Поскольку написано в них немного, я решил рассмотреть эту тему подробней.

Итак драйвер — это особый тип библиотеки, которая состоит из одного родительского класса и нескольких дочерних. Дочерние классы получают доступ только к родительскому классу, но не имеют доступа к свои собратьям. Термин «дочерний» на самом деле не наследует поля родителя, а лишь получает к ним доступ.

Драйверы служат для разбиения ваших библиотек на отдельные классы и в 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();
        // покажет записи из твиттера
    }
}


Приведенный пример конечно очень простой, но он показывает как можно создавать удобные библиотеки, которые можно будет использовать потом в других проектах.
Tags:
Hubs:
+18
Comments19

Articles

Change theme settings