Подскажите пожалуйста, как граматно реализовать следующее:
Пишу движек сайта, нужен конфиг в котором описаны переменные, нужен default-конфиг в котором описаны "константы".
Переменные конфига и "константы" частично рассчитываются динамически - т.е. 1 раз при загрузке
соответствующего конфига.
Основной движек должен в начале загрузить конфиг, конфиг должен загрузить default-конфиг.
Переменные конфига и "константы" должны быть доступны движку.
Далее, движек должен загрузить и проинициализировать основные библиотеки/модули и обеспечить работу с ними.
По необходимости движек должен подгружать модули для расширения функциональности если это нужно (работа с БД).
Посмотрел много OpenSource решений, сделал вариант приведенный ниже.
Посоветуйте как его оптимизировать?
Сделал такой вариант (мне кажется это плохой вариантом):
Конфиг - 'engine_config.pl', в нем:
(из него переменные доступны как '$ENGINE::VAR_NAME')
{
package ENGINE;
$DIR_SITE_ENGINE = '/dir/...';
$DIR_SITE_ENGINE = '/dir/...';
$DB_HOST = 'www.host.com';
# и так далее
}
require 'engine_def_config.pl';
Default-конфиг - 'engine_def_config.pl', в нем:
(его переменные подгружаются в тот же userspace)
{
package ENGINE;
$DEF_VAR1 = 'value1';
$DEF_VAR2 = 'value2';
# и так далее
}
Загрузчик модулей 'engine.pm', в нем:
package ENGINE;
use Exporter;
use strict;
use lib $ENGINE::DIR_SITE_ENGINE_LIB;
use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER;
require $ENGINE::DIR_SITE_ENGINE_LIB.'engine_config.pl';
use Carp qw(longmess);
# Modules checks
$CT::HANDLE_LOGGER = undef;
eval { require ENGINE::Logger; };
if ($@) { print "No Logger"; }
else { $CT::HANDLE_LOGGER = ENGINE::Logger->new(); }
# Logger
sub LOG {
$ENGINE::HANDLE_LOGGER->add(@_) if ($ENGINE::HANDLE_LOGGER);
}
# и так далее
В основном движке:
require '..../lib/engine_config.pl';
use strict;
use lib $ENGINE::DIR_SITE_ENGINE_LIB;
use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER;
use ENGINE; # That module will load all needed...
&ENGINE::LOG('info', 'Testing 1');
Хочется оптимизировать следующее:
- не хочеся в каждом модуле писать 'use lib $ENGINE::DIR_SITE_ENGINE_LIB;',
хетелось бы 1 раз это cдеалть чтобы все модули знали.
- не хочеся в каждом модуле писать require '..../lib/engine_config.pl',
хетелось бы 1 раз это cдеалть чтобы все модули знали.
- надо чтобы движек мог при необходимости подгружать модули (например для работы с БД), не хочется во всех
таких модулях делать 'use lib $ENGINE::DIR_SITE_ENGINE_LIB;' и 'require '..../lib/engine_config.pl''
- кстати 'require '..../lib/engine_config.pl'' в кадом модуле заново дергает 'engine_config.pl' и
рассчитывает в нем переменные заново или это всетаки делается 1 раз?
- хочется граматно подгружать необходимые модули чтобы они были доступны из движка,
т.е. делать типа "requre 'module.pm'" для модулей вида:
package ENGINE;
use Exporter;
use strict;
use lib $ENGINE::DIR_SITE_ENGINE_LIB;
use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER;
require $ENGINE::DIR_SITE_ENGINE_LIB.'engine_config.pl';
use Carp qw(longmess);
# Modules checks
$CT::HANDLE_DB = undef;
eval { require ENGINE::DB; };
if ($@) { die "No DB"; }
else { $CT::HANDLE_DB = ENGINE::DB->new(); }
sub DB_OPEN {
...
}
Вызов функций такого модуля будет через:
ENGINE::DB_OPEN(...);
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум [RADIUS] Не могу собрать модуль (2010)
- Форум Почему не работает скрипт? (2013)
- Форум Прошу помощи с кросс-компиляцией библиотеки qt-gstreamer (QtGstreamer) для ARM (2017)
- Форум squid + icap for CORS (2022)
- Форум Помогите собрать Ardour 3.2 с поддержкой windows-vst. (2013)
- Форум Подскажите как реализовать (2010)
- Форум подскажите как реализовать... (2008)
- Форум Подскажите как реализовать (2008)
- Форум Подскажите как реализовать (2007)
- Форум Подскажите как реализовать (2006)