Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)
Sparks - это новая система управления пакетами для CodeIgniter, которая расширяет ядро с поддержкой gem-подобных искр.
Этот учебник переплетает обзор архитектуры и использования системы искр начального уровня с созданием dovecote - простой искры для управления данными RSS.
Введение
Пакеты - это блоки кода с возможностью его повторного использования, которые могут сделать жизнь разработчиков намного проще.
Разработчики CodeIgniter давно завидовали менеджерам пакетов, таким как gems и npm, системам, которые предоставляют своим соответствующим сообществам инструменты и центральный репозиторий для разработки, переработки и совместного использования полезных компонентов приложения. Теперь ожидание закончилось. Благодаря новой системе - искры -разработчикам CodeIgniter, наконец, можно порадоваться, так у них появилась наконец их собственная растущая система управления пакетами.
Обзор
Если вы раньше не работали с ними, просто подумайте о пакетах как блоках повторно используемого кода, которые могут сделать жизнь разработчиков намного проще. Может быть, вам нужен интерфейс для хранилища в облаке Amazon? Пропустите поздние ночи, изучая документацию S3 и просто хватайте искру.
Со своей стороны, система искр состоит из трех частей:
- Центральный репозиторий (getsparks.org) для хранения и обмена искрами
- Утилита для управления искрами, установленными в данном приложении CodeIgniter
- Сами искры
Для целей этого урока мы представим первые два, но сосредоточимся на разработке с искрами и некоторых основных соображениях при разработке своей искры. Звучит неплохо? Давайте посмотрим, как это делается.
Шаг 1: Установка искры
Официальная документация: искры предназначены для интеграции в ядро CodeIgniter, возможно, сразу же после выхода в версии 2.1. Но поскольку они не является частью установки по умолчанию, все же вам нужно настроить систему вручную.
Если вы работаете под OSX или Linux, или если в Windows установлен интерфейс командной строки PHP, установка выполняется так же просто, как установка чистой копии CodeIgniter и выдача следующего в каталоге установки:
1 |
$ php -r "$(curl -fsSL http://getsparks.org/go-sparks)" |
Если все пойдет хорошо, вы должны увидеть что-то вроде этого:



Если по какой-то причине это не сработало, или если вы работаете в Windows и не добавили PHP в свой командный путь, вы также можете установить искры вручную. Потребуется немного больше работы, но результат тот же:
- Добавление каталога с именем
sparks
в корень вашего каталога codeigniter - Добавление пользовательского класса Loader в
application/core/MY_Loader.php
- (необязательно) Загрузка и извлечение утилиты командной строки sparks в каталог codeigniter
Теперь ваша установка CodeIgniter должна быть пропатчена, чтобы поддерживать искры.
Шаг 2: Начало работы
В средневековой Европе каждый усадебный дом включал небольшую флигель для голубей под названием голубятня. Поскольку мы будем создавать искру, которая включает в себя как твиты, так и фид, то это имя достаточно хорошо подходит. Но оно также отвечает единственному требованию при именовании: чтобы быть включенным в репозиторий в GetSparks.org,
имена проектов GetSparks должны быть уникальными
Обозначение искры
Прежде чем мы сможем начать писать код, нам нужно будет развернуть проект. В директории sparks
в корне вашей установки CodeIgniter (создайте ее, если она не существует) добавьте новую папку для хранения искры:
1 |
/sparks/dovecote |
Согласно соглашению искры организованы по версиям, поэтому нам понадобится вложенная папка для хранения первого черновика. 0.0.1
- хорошее место для начала.
1 |
/sparks/dovecote/0.0.1 |
В этой папке будут выполняться все действия. Когда в остальной части учебника я буду упоминать «директория искры» - это она.
Файл spark.info
До сих пор все выглядит довольно гладко, но мы готовы начать их заполнять. Первая часть искры - и единственный файл, технически необходимый для искровой утилиты, - spark.info
. Создайте новый файл с именем spark.info
в своей spak директории и добавьте следующее:
1 |
name: dovecote |
2 |
version: 0.0.1 |
3 |
compatibility: 2.0.2 |
4 |
dependencies: |
5 |
Atomizer: 0.0.1 |
6 |
tags: ["twitter","api","social"] |
Эти поля представляют собой всю информацию, необходимую утилите искр для управления версией и зависимостями всех искр в этой установке CodeIgniter. Утилита будет искать пять позиций, но требуются только первые три:
-
name
- уникальный идентификатор искры -
version
- текущая версия -
compatibility
- минимальная версия CodeIgniter -
dependencies
- (необязательно) другие искры, требуемые этой искрой -
tags
- (необязательные) теги, которые описывают эту искру
Даже если вы не планируете использовать искровую утилиту самостоятельно, все равно будет хорошим тоном включить файл spark.info
в любую искру, которую вы планируете распространять. Одним из реальных преимуществ управления искрами таким образом, а не вставкой их непосредственно в каталог sparks
, является то, что менеджер искры может использовать информацию о совместимости, зависимости и версии в каждой искре, чтобы обеспечить совместимость с текущей установкой CodeIgniter и друг другом. Есть еще одно преимущество, как мы скоро увидим: искры, установленные вне утилиты менеджера, должны иметь свои зависимости, установленные вручную.
Организация искры
После создания информационного файла пришло время придать искре некоторую структуру. Создайте четыре новые папки в каталоге искры:
- config
- helpers
- libraries
- views
Если вы раньше работали с CodeIgniter, то для вас, вероятно, это будут знакомые имена. Класс Loader
в CodeIgniter рассматривает искры как пакеты, а это означает, что содержимое этих каталогов проверяется для любых компонентов приложения, которые не могут быть найдены в каталоге /application
. На данный момент это относится к пяти типам ресурсов:
- configs
- helpers
- libraries
- models
- views
Шаг 3: Написание Искры
Прежде чем мы начнем писать код, найдите момент, чтобы убедиться, что ваша директория содержит все необходимые фрагменты.



Все в порядке? Давайте продолжим.
Создайте файл в недавно созданном каталоге config
и назовите его dovecote.php
. Мы будем хранить несколько основных опций здесь, чтобы дать знать искре, где она может найти RSS данные:
1 |
<?php /** config/dovecote.php **/ |
2 |
|
3 |
// Username to retrieve tweets from:
|
4 |
$config[ 'twitter' ] = 'getsparks'; |
5 |
|
6 |
// API endpoint to query for tweets:
|
7 |
$config[ 'twitterURL' ] = 'http://twitter.com/statuses/user_timeline/%s.rss'; |
8 |
|
9 |
// Feed carrying RSS data:
|
10 |
$config[ 'feedURL' ] = 'http://feeds.bbci.co.uk/news/rss.xml'; |
11 |
|
12 |
?>
|
Не так много - мы определили имя пользователя twitter (@getsparks), чтобы получить твиты, предоставив API ендпоинт для API Twitter и добавив дополнительный URL-адрес для поиска новостей RSS.
Теперь искра знает, где можно найти данные, пришло время получить некоторые каналы. Для этого нам нужно создать библиотеку - назвать dovecote.php
и сохранить ее в каталоге libraries
:
1 |
<?php /** libraries/dovecote.php **/ |
2 |
|
3 |
class dovecote { |
4 |
|
5 |
protected $ci, $timeline; |
6 |
|
7 |
public function __construct() { |
8 |
$this->ci = &get_instance(); |
9 |
}
|
10 |
|
11 |
public function retrieve() { |
12 |
|
13 |
// build twitter request URL
|
14 |
$twitterURL = sprintf( $this->option( 'twitterURL' ), $this->option( 'twitter' ) ); |
15 |
|
16 |
// get RSS Data
|
17 |
$tweets = $this->ci->atomizer->loadURL( $twitterURL ); |
18 |
$feed = $this->ci->atomizer->loadURL( $this->option( 'feedURL' ) ); |
19 |
|
20 |
// set channel information for new feed
|
21 |
$info = array( |
22 |
'title' => 'Convolved feed' |
23 |
);
|
24 |
|
25 |
// mix the two feeds together
|
26 |
$this->timeline = $feed->convolve( $tweets, $info ); |
27 |
|
28 |
return $this->timeline; |
29 |
}
|
30 |
|
31 |
public function publish() { |
32 |
header('content-type: application/rss+xml'); |
33 |
echo $this->timeline->save(); |
34 |
}
|
35 |
|
36 |
// retrieve an option ($key) from config files
|
37 |
protected function option( $key ) { |
38 |
return $this->ci->config->item( $key ); |
39 |
}
|
40 |
}
|
41 |
|
42 |
?>
|
Эта библиотека предоставляет вспомогательные функции для извлечения параметров из нашего файла конфигурации и публикации RSS-канала, но критической частью является retrieve()
. Эта функция захватывает данные RSS от поставщиков, описанных в файле конфигурации dovecote, в несколько этапов:
- Сначала создается адрес RSS-канала Twitter. В конфиге есть имя пользователя (
twitter
) и ендпоинт (twitterURL
); теперь они объединяются с помощьюsprintf
. - Затем данные RSS в каждом канале извлекаются с помощью функции
loadURL
в библиотекеautomizer
. Эта функция возвращает объект «AtomizerFeed
», который предоставляет некоторые полезные функции для управления данными RSS. - Наконец, операция
convolve
уAtomizerFeed
используется для объединения двух элементов фидов в один канал, который и возвращается.
На данный момент мы почти готовы запустить нашу голубятню в реальном приложении. Нам просто нужно проверить, чтобы наше приложение включало все зависимости dovecote и что сама искра будет загружаться правильно.
Шаг 4: Зависимости
Когда мы создавали файл spark.info
, напомним, что мы описали зависимости dovecote:
1 |
Dependencies: |
2 |
Atomizer: 0.0.1 |
Это означает, что наша искра для своей работы, полагается на другую искру - Atomizer. Как только искры будут привязаны к репозиторию getparks.org, утилита менеджера автоматически загрузит необходимые зависимости. Но пока мы работаем локально, нам нужно будет сделать это самим.
Если вы используете менеджер искр, вы можете установить Atomizer, перейдя в каталог CodeIgniter и вызывая функцию install
у менеджера:
1 |
php tools/spark install -v0.0.2 atomizer |
Примечание. Если вы работаете в Windows, вам вместо этого нужно будет вызвать php tools \ spark install -v0.0.2 atomizer
.
Если вы не используете менеджера или если установка не завершилась успешно, вы можете загрузить Atomizer прямо с Github и извлечь его в каталог sparks
вашего приложения рядом с папкой, содержащей dovecote.
Шаг 5: Автозагрузка
До того, как dovecote будет доступен для других частей приложения, нам нужно убедиться, что он будет загружаться правильно. Вернитесь в папку конфигурации в своем каталоге искры и вставьте следующее в новый файл с именем autoload.php
.
1 |
<?php /** config/autoload.php **/ |
2 |
|
3 |
// load default configuration
|
4 |
$autoload['config'] = array( 'dovecote' ); |
5 |
|
6 |
// load dependency
|
7 |
$autoload['sparks'] = array( 'atomizer/0.0.2' ); |
8 |
|
9 |
// load library
|
10 |
$autoload['libraries'] = array( 'dovecote' ); |
11 |
?>
|
Всякий раз, когда CodeIgniter загружает искру, он попытается загрузить все ресурсы, перечисленные в файле autoload.php
. Это позволяет авторам искры определять ресурсы, с которыми пользователи должны иметь непосредственный доступ, когда они загружают искру. Так как библиотека dovecote
указана здесь, например, мы сразу получим доступ к функции retieve
, как только искра будет загружена.
Стоит отметить, что ресурсы, описанные в autoload.php
, не обязательно должны находиться в каталоге искры. Пока они находятся где-то в пути поиска CodeIgniter, приложение должно быть в состоянии их найти. Обратите внимание, что atomizer
загружается в приведенном выше примере; было бы мало толку от зависимостей искры, если их не удалось загрузить!
Сохраните файл автозагрузки, и давайте загрузим все. В welcome контроллере вашего основного приложения (/application/controllers/welcome.php
) добавьте следующее:
1 |
public function dovecote() { |
2 |
$this->load->spark( 'dovecote/0.0.1' ); |
3 |
$this->dovecote->retrieve(); |
4 |
$this->dovecote->publish(); |
5 |
}
|
Давайте пройдемся по коду:
- Мы просим CodeIgniter загружать dovecote, зная, что будут загружены все ресурсы, запрошенные в
config/autoload.php
- Функция
retrieve
используется для получения копий RSS-каналов, описанных в файлеconfig/dovecote.php
- Объединенная временная шкала, полученная с помощью
retrieve
, подается в виде RSS-канала, используя функциюpublish
А теперь посмотрим в действии
Перейдите по адресу welcome/dovecote
в своем браузере, и вы увидите RSS-канал, в котором будут перечислены твиты и статьи, которые собирает наша голубятня.
Шаг 6: Создание искры
Давайте сделаем dovecote немного более полезным. Сначала мы создадим базовый шаблон представления, чтобы показать название каждой статьи на нашей временной шкале:
1 |
<?php /** views/dovecote_timeline.php */ ?> |
2 |
|
3 |
<h3>Recent Happenings:</h3> |
4 |
<ol>
|
5 |
<?php foreach ($items as $item): ?> |
6 |
<li><?php echo $item->title; ?></li> |
7 |
<?php endforeach; ?> |
8 |
</ol>
|
Затем мы сделаем представление доступным, предоставив функцию-хелпер, которую другие части приложения могут использовать для отображения временной шкалы в HTML.
1 |
<?php /** helpers/dovecote_helper.php */ |
2 |
|
3 |
function dovecote_timeline() { |
4 |
|
5 |
$ci = &get_instance(); |
6 |
|
7 |
$feed = $ci->dovecote->retrieve(); |
8 |
|
9 |
$data = array( |
10 |
'items' => $feed->items() |
11 |
);
|
12 |
|
13 |
$ci->load->view( 'dovecote_timeline', $data ); |
14 |
}
|
15 |
|
16 |
?>
|
Функция dovecote_timeline
и ее одноименное представление теперь могут использоваться для отображения временной шкалы в любом месте нашего приложения. Но в соответствии с философией CodeIgniter, мы не будем делать ее доступной автоматически через autoload.php
. Вместо этого нам нужно будет вручную загрузить помощник, когда это необходимо. Вернитесь к контроллеру приветствия вашего приложения и обновите функцию dovecote
для генерации HTML-версии фида:
1 |
public function dovecote() { |
2 |
$this->load->spark( 'dovecote/0.0.1' ); |
3 |
$this->load->helper( 'dovecote' ); |
4 |
|
5 |
$this->dovecote->retrieve(); |
6 |
|
7 |
// call the helper function
|
8 |
echo dovecote_timeline(); |
9 |
}
|
Обновите свой браузер, и теперь вы должны увидеть список всех элементов на временной шкале dovecote.



Подведем итоги
Поздравляю! Теперь вы являетесь владельцем очень простой искры, но еще много чего можно сделать. Перед тем, как опубликовать dovecote, вы можете рассмотреть возможность создания дополнительных функций. Детали зависит от вас, но некоторые полезные функции могут включать:
- кэширование ответов API
- отображения для красивого отображения полученных данных
- сохранение данных для сохранения старых элементов временной шкалы
Этот урок поверхностное описание того, что можно сделать с помощью искр, и показывает преимущества, которые дают искры в минимизации дублирования кода и ускорения разработки.
Работаете над собственной искру? Столкнулись с проблемами? Поделитесь ими в комментариях ниже и благодарю вас за чтение!