Отражения (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, но тут решение эстетическое и повторно используемое.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *