BRMS на php с отражениями

Отражения (Reflection API) в php — мощный инструмент для самоанализа кода. Давно не писал ничего интересного, а тут такая интересная мини-задачка - написать маленькую систему бизнес-правил aka BRMS для обработки сложных форм, причём не просто десять табов который сохраняются в БД, а анализ который приводит к каким-то выводам.

В качестве ядерного решения  выступает вызов правил как методов, но тут ещё такая особенность что поскольку форма не одна, и поскольку они очень похожи, то решение - вызывать методы на основе входных данных. Грубо говоря - приходит 40 input-полей, мы анализируем какие из этих полей подходят в качестве аргументов конкретному методу (скажем 3) и вызываем его уже с 3 аргументами (вместо передачи всего массива).

Как я выше написал, анализ проводится с помощью малодокументированными но вполне рабочими отражениями. В итоге примерно такой код..
$oRuleContainer = new cRuleContainer(); //просто класс с методами-правилами $rContainer = new ReflectionClass('cRuleContainer'); //отражение класса //где-то тут цикл по вызываемым методам, можно проходится по всем //но я проходил по методам из базы, поэтому его опускаю.. тут появляется $aRule $rMethod = $rContainer->getMethod($aRule['method']); $aArgs = $rMethod->getParameters(); //выбираем только нужные аргументы if($aArgs){ foreach($aArgs as $refArgument){ $arrPassedArgData[$refArgument->name]=$_POST[$refArgument->name]; } } if(call_user_func_array(array($oRuleContainer,$aRule['method']),$arrPassedArgData)){ //правило сработало }
Кстати, я прекрасно понимаю что можно вызывать правила без ничего, читая всё из POST, но тут решение эстетическое и повторно используемое.
RSS

Комментарии

  • Антон
    это больше похоже на rule engine, чем BRMS
  • Артём Курапов
    Эта часть занимается только запуском. В более общем понимании правила можно грабить тоже из базы и динамически их добавлять в контейнер. А как их там уже для обычного пользователя делать редактирование - уже другой вопрос. Если ты об этом.
  • Антон
    ок, да, я об этом