Witam,
napisałem haka, który umożliwia bezbolesną pracę kilku aplikacji w obrębie jednej macierzystej. Co rozumiem pod pojęciem aplikacji? U mnie akurat są to:
- część przeznaczona dla użytkowników,
- część administracyjna,
- zadania odpalane CRONem.
Cały "moduł" składa się z jednego haka, który należy umieścić jako
application/hooks/multi_app_hook.php:
<?php
/**
* Hak ustawiający konfigurację dla aktualnej aplikacji.
*
* Aktualizuje dane konfiguracyjne o dane charakterystyczne dla danej aplikacji.
* Do jego poprawnej pracy wymagane jest zdefiniowanie stałej APPNAME w index.php.
*
* @author Michał "phpion" Płonka
* @package Hooks
*/
class Multi_app_Hook {
/**
* Aktualizuje dane konfiguracyjne.
*
*/
public function setup() {
// Sprawdza czy ustawiono stałą APPNAME.
if (!defined('APPNAME')) {
trigger_error('APPNAME is not defined.', E_USER_ERROR);
}
//
// Ścieżka do katalogu z konfiguracją aplikacji.
$app_config_dir = 'config/'.APPNAME;
// Sprawdzenie czy istnieje katalog z konfiguracją aplikacji.
if (file_exists(APPPATH.$app_config_dir) && is_dir(APPPATH.$app_config_dir)) {
foreach (Kohana::list_files($app_config_dir, TRUE) as $file) {
$file = str_replace(array(APPPATH.'config/', EXT), '', $file);
$config_file = str_replace(APPNAME.'/', '', $file);
// Pobranie konfigu aplikacji.
$config = Kohana::config($file);
if (!is_null($config)) {
// Aktualizacja danych konfiguracyjnych.
Kohana::config_set($config_file, array_merge(Kohana::config($config_file), $config));
}
}
}
//
// Aktualizacja konfigu core.
$config = Kohana::config('config');
if (!is_null($config)) {
Kohana::config_set('core', $config);
}
//
}
}
Event::add('system.ready', array('Multi_app_Hook', 'setup')); Oczywiście aby hak został uruchomiony należy
aktywować obsługę haków w konfiguracji.
Jak widać hak wymaga zdefiniowania stałej APPNAME, po której rozpoznawany będzie typ aplikacji. Należy więc w
index.php dodać:
define('APPNAME', 'frontend');
Można teraz przystąpić do konfigurowania konkretnej aplikacji. W tym celu w katalogu
application/config tworzymy dodatkowy podkatalog
frontend (czyli w rezultacie otrzymujemy
application/config/frontend). W katalogu tym możemy umieszczać konfigi specyficzne dla danej aplikacji. Opiszę to na przykładzie konfigu dla
locale.
Domyślny konfig systemowy.
system/config/locale.php:
<?php defined('SYSPATH') OR die('No direct access allowed.');
/**
* @package Core
*
* Default language locale name(s).
* First item must be a valid i18n directory name, subsequent items are alternative locales
* for OS's that don't support the first (e.g. Windows). The first valid locale in the array will be used.
* @see http://php.net/setlocale
*/
$config['language'] = array('en_US', 'English_United States');
/**
* Locale timezone. Defaults to use the server timezone.
* @see http://php.net/timezones
*/
$config['timezone'] = '';
Domyślny konfig dla całej aplikacji.
application/config/locale.php:
<?php
$config['language'] = array('pl_PL', 'Polski');
$config['timezone'] = 'Europe/Warsaw';
Konfig charakterystyczny dla wybranej aplikacji (tu: frontend):
application/config/frontend/locale.php:
<?php
$config['timezone'] = 'America/Los_Angeles';
No i to w zasadzie tyle

Po uruchomieniu Kohany możemy zobaczyć zawartość konfiga:
print_r(Kohana::config('locale'));
co da nam:
Array
(
[language] => Array
(
[0] => pl_PL
[1] => Polski
)
[timezone] => America/Los_Angeles
)
Odwołanie do wybranego elementu również działa (co nie jest zaskoczeniem

):
echo Kohana::config('locale.timezone');
wyświetli:
America/Los_Angeles
Jak widać kaskadowość została w pełni zachowana: wczytane wartości systemowe zostały nadpisane domyślnymi dla aplikacji (standardowe zachowanie Kohany), które to natomiast dalej zostały zaktualizowane o te charakterystyczne dla aktualnej aplikacji.
Mam nadzieję, że komuś się przyda. Mi tak

// Edit:
Poprawiłem bug przy nadpisywaniu konfiga "config", który dodatkowo powinien zaktualizować konfig "core".