Polski support
KohanaPHP Framework
FORUM Polskiego Supportu KOHANA Framework
29 Lipiec 2010, 13:01 *
Witamy, Gość. Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: 18.10.2009 - wydanie 3.0.1
Strony: [1]   Do dołu
  Drukuj  
Autor Wątek: Obsługa wielu aplikacji (multi_app) - tworzenie konfiguracji  (Przeczytany 1206 razy)
phpion
NKTeam
Zaawansowany użytkownik
*
Offline Offline

Wiadomości: 378



Zobacz profil
« : 14 Styczeń 2010, 12:30 »

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_dirTRUE) 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_filearray_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 Uśmiech Po uruchomieniu Kohany możemy zobaczyć zawartość konfiga:
print_r(Kohana::config('locale'));
co da nam:
Kod:
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 Mrugnięcie):
echo Kohana::config('locale.timezone');
wyświetli:
Kod:
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 Uśmiech

// Edit:
Poprawiłem bug przy nadpisywaniu konfiga "config", który dodatkowo powinien zaktualizować konfig "core".
« Ostatnia zmiana: 15 Styczeń 2010, 11:52 wysłane przez phpion » Zapisane

Warsztat: Eclipse Helios PDT + PHP 5.3.2 + PostgreSQL 8.4 + Kohana 2.3.4

Problem rozwiązałem, temat do zamknięcia
Strony: [1]   Do góry
  Drukuj  
 
Skocz do: