Про Registry вопрос

Духовность™

Продвинутый новичок
Про Registry вопрос

Так уже получилось, в моем изначальном проекте была такая структура конфига, т.е. многомерный массив. Такой же массив был и для переменных шаблона. Конфиги получились большие, на тыщу строк.

Как только я осознал, что в классах и функциях зачастую необходимо использовать эти параметры конфигурации, то классы были завалены global-ами:
PHP:
class a{
    function aa{
        global $_CONFIG['dir']['images']['preview'];
    }
}
Потом пришла идея создать такую функцию со статическим кэшированным хранилищем, абстрагироваться от самого $_CONFIG-массива:
PHP:
function getConfig()
{
    global $_CONFIG;
    $cfg = $_CONFIG;
    static $data = array();

    $args = func_get_args();
    $key = serialize($args);

    if (!isset($data[$key]))
    {
        foreach ($args as $arg)
        {
            if (isset($cfg[$arg]))
            {
                $cfg = $cfg[$arg];
            }
            else
            {
                trigger_error('Не найден элемент '.$arg.' массива $_CONFIG');
            }
        }

        $data[$key] = $cfg;
    }

    return $data[$key];
}

// получение значения
$path = getConfig('dir', 'images', 'preview');
Сейчас хочу использовать Registry.

Хочется узнать у уважаемой публики, столи ли хранить конфиги как это делал я -- в многомерных массивах (естественно, внутри Registry) или же не делать столь сложных структур? Где инстанцировать звездные классы? В самом Registry или же в глобальной области видимости, а уже потом отдавать экземпляры объектов в реестр?
 

jonjonson

Охренеть
Попробуй :)
Хотя идея регистри сохранить в одном месте всякую популярную срань, не задумываясь насколько срань ярко выражается словом срань.
 

fixxxer

К.О.
Партнер клуба
вообще регистри это плохо, те же глобалсы вид сбоку.

если не получается держать конфиг только в контроллере, а всему остальному передавать параметры в конструкторе или сеттерами, то где-то что-то не в порядке с архитектурой. вот у тебя явно есть какой-то класс обработки изображений, можешь ли ты его использовать в другом проекте без завязки на кучу глобалсов? если нет, это плохо. хотя такой способ, с регистри и звездными объектами, заведомо меньше напрягает головной мозг, чо уж там, сам так делаю когда времени не хватает:)
 

jonjonson

Охренеть
fixxxer, регистри - не плохо. Оно просто есть как следующий шаг синглетонов.
 

pilot911

Новичок
Автор оригинала: fixxxer
вообще регистри это плохо, те же глобалсы вид сбоку.

если не получается держать конфиг только в контроллере, а всему остальному передавать параметры в конструкторе или сеттерами, то где-то что-то не в порядке с архитектурой. вот у тебя явно есть какой-то класс обработки изображений, можешь ли ты его использовать в другом проекте без завязки на кучу глобалсов? если нет, это плохо. хотя такой способ, с регистри и звездными объектами, заведомо меньше напрягает головной мозг, чо уж там, сам так делаю когда времени не хватает:)
остается вопрос - зачем использовать класс в другом проекте :)
 

fixxxer

К.О.
Партнер клуба
jonjonson
плохо именно поскольку
>> сохранить в одном месте всякую популярную срань

то есть, если таких объектов 2-3, ничего страшного, и даже удобно. но всегда велик соблазн запихать туда все подряд.
 

AmdY

Пью пиво
Команда форума
меня регистри вовсе напрягает, хотя и юзаю для ООП-шности
:(.
global $_CONFIG - бр.
если юзать сразу $GLABALS['_CONFIG'], то сразу куча телодвижений отпадает.
 

cDLEON

Онанист РНРСlub
остается вопрос - зачем использовать класс в другом проекте
А зачем заниматься копи-пастом ?
И зачем писать в стиле ООП, если проект расширять не нужно будет ? Пишите макаронами.
 

fixxxer

К.О.
Партнер клуба
синглтон, кстати, тоже опасный паттерн. :) очень легко его заюзать там, где не надо.
 

jonjonson

Охренеть
fixxxer, любой хоть сколько универсальный код - подпорка. При определённой сложности требуется компромисс между помойкой и журналом размещения мусора (документированием). Просто сложность по факту требует такого рефакторинга, что проще декларируемую мусорку тягать.
 

fixxxer

К.О.
Партнер клуба
передать? а почему сам контроллер их получить не может?


> ServiceLocator

во, теперь я знаю, как это называется. :) да, это хороший способ.
 

pilot911

Новичок
Автор оригинала: cDLEON
А зачем заниматься копи-пастом ?
И зачем писать в стиле ООП, если проект расширять не нужно будет ? Пишите макаронами.
если не стоит задача универсальности - писать класс для возможности внешнего использования, то можно и не заморачиваться на исключение из класса конфигов
 

fixxxer

К.О.
Партнер клуба
[upd] ну кстати смотря что за конфиги.
что-то в контроллере уместно, что-то в классе сущности, если конфиг локален для.
 

whirlwind

TDD infected, paranoid
triumvirat заведу свою любимую песню - покажи реальный пример контроллера, которому требуется тыща конфигов. В подавляющем большинстве случаев, достаточно Request и View. Вот реальный пример (это не конфиг, но почти то же самое)

PHP:
class MPS_UI_X_FrontController extends MPS_UI_FrontController {
    protected $_auth;
    
    function __construct(MPS_UI_Auth $auth,MPS_UI_Factory $f){
        $this->_auth = $auth;
        parent::__construct($f);
    }
    
    function run(MPS_RequestEnvironment $env,MPS_DataMapper_IRegistry $dmf){
        $merch = $this->_auth->getLoggedUser($env->getServer(),
            $dmf->getMapper('Merchant'));
        if ( !$merch ) return;
        $env->getServer()->setVar('merchant',$merch);
        $env->getView()->setVar('username',$merch->getLogin());
        return parent::run($env,$dmf);
    }
    
}
 

fixxxer

К.О.
Партнер клуба
какой глобал?
у тебя выше контроллера по стеку вызовов еще что-то есть?
 

Духовность™

Продвинутый новичок
fixxxer нет наверно...

whirlwind
ок спасибо

-~{}~ 17.11.08 16:46:

если таких объектов 2-3, ничего страшного, и даже удобно.
если всего 2-3 объекта, то какой особый резон вообще Registry иметь? 2-3 объекта - это наверняка сингелтоны request, db, response и что-нибудь подобное..
 
Сверху