Использование динамических поддоменов в Code Igniter

12th Апрель 2011 | Категории: Code Igniter, PHP | Метки:

Code Igniter, как и множество других фреймворков, поддерживает функционал мультиприложения: одно ядро и множество каталогов-приложений. Выбор нужного приложения производится в index.php, путем изменения значения переменной:

$application_folder = "../test";

Иногда перед разработчиком встает задача запуска разных приложений в зависимости от параметров URI. Это может быть как обычный параметр GET, POST, значение сессии, поддомен или что-то еще.

Когда может пригодиться функционал мультиприложения?

У вас независимые CMS + Форум + Магазин + Статистика. Хотя приведенный пример можно реализовать и через простые модули, но попадаются примеры и сложнее. К примеру, у нас конечный продукт интернет-магазин и нам надо предоставить демо-режим. Или, к примеру, у нас есть три компании-клиента, и мы хотим, чтобы у каждой компании был независимый форум + блог разработчика (Форум + Форум + Форум + Блог). Тиражирование каталога с приложением «форум» отметаем сразу, и попробуем реализовать задуманное через настройку пути приложения с передачей параметра через поддомены.

Что такое поддомен?

Для адреса некой веб-страницы вида http://sub.cite.com — «sub» является его поддоменом.

Что бы выбрать нужное приложение необходимо определить какой поддомен был вызван, для этого в начало index.php добавим код:

$sub = '';
 
if (isset ($_SERVER['HTTP_HOST'])) {
 
	$url_path = explode('.', $_SERVER['HTTP_HOST']);
 
	if (count($url_path) == 3 AND $url_path[0] != 'www') {
		$sub = $URL[0];
	}
	if (count($url_path) == 4 ) {
		$sub = $url_path[1];
	}
 
	unset($url_path);
}
else {
 
}
 
define('SUB', $sub);

В переменной $_SERVER[‘HTTP_HOST’] содержится имя сервера. Для того, чтобы определить поддомен, воспользуемся простым алгоритмом: разобьем строку, содержащую URL на подстроки (в качестве разделителя используем точки «.»), и результат разбиения занесем в массив. Так как URL может содержать префикс www, то возможны два варианта: www.sub.cite.com и sub.cite.com. Проверим оба. Если проверка была успешной, занесём в константу SUB имя поддомена — она нам еще пригодится.

Итак. Поддомен определили. Далее нужно указать папку с нужным приложением. Для простого случая, когда у нас несколько приложений и некоторым поддоменам соответствует своё, уникальное приложение используем следующий код (index.php):

switch(SUB) {
	case 'blog': $application_folder = "../blog"; break;
	case 'forum': $application_folder = "../forum"; break;
	case 'forum2': $application_folder = "../forum"; break;
	case 'forum3': $application_folder = "../forum"; break;
 
	default: $application_folder = "../app";
}

В каталоге ../forum будет находится приложение с форумом. Для того, что бы в зависимости от поддомена загружались разные форумы необходимо:

1. Создать конфигурационные файлы, описывающие настройку приложения форум для каждого поддомена. Для гибкости конфигурирования будем хранить все настройки в БД, а в файлах с настройками хранить префикс для таблиц.

 

 

 

Внимательный читатель уже заметил, что имя файла с конфигурацией соответствует шаблону cfg_{поддомен}.php.

2. Загрузить нужный конфиг. Это можно сделать в конструкторе модели:

function __construct() {
	parent::__construct();
 
	$this->config->load('cfg_'.SUB);
	$this->table_prefix = $this->config->item('table_prefix');
}

Все обращения к БД перепишем, добавив использование префикса:

$sql = "SELECT * FROM `{$this->table_prefix}posts` ORDER BY post_time DESC";

3. Изменить код определения base_url (в главном конфиге ../forum/config/config.php):

$root = "http://".$_SERVER['HTTP_HOST'];
$root.= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
$config['base_url'] = "$root";

Подобный код будет полезен и для других проектов, позволяя забыть о настройке этого параметра.

Вот и всё.

Данный подход имеет свои плюсы и минусы.

Плюсы:

  • У нас одно приложение — для обновления версии и всех приложений необходимо обновить единственный каталог;
  • Нет copy & paste — это вселенское зло;
  • Таблицы разных приложений находятся в одной БД — можно обращаться друг к другу и выводить данные из других приложений (хорошо для администрирования);

Минусы:

  • Хардкорное добавление — чтобы добавить еще одно приложение, необходимо внести правки в файл, создать таблицы и конфиг;
  • Если нужны не однотипные приложения — придется делать расширенную конфигурацию и в отображениях учитывать множество параметров;
  • Невозможно просмотреть список созданных приложений (кроме как напрямую в коде index.php);

В следующий раз мы попробуем исправить минусы и сделать более универсальным данное решение.

Subscribe without commenting


Пока комментариев нет.