/** * Generator inner branches loop handler. * * @param Branch $branch Branch for looping its inner branches * @param bool $conditionStarted Return variable showing if inner branching has been started * @param string $pathValue Current routing logic $path variable name */ protected function generatorBranchesLoop(Branch $branch, &$conditionStarted, $pathValue) { // First stage - open condition // If we have started condition branching but this branch has parameters if ($conditionStarted && $branch->isParametrized()) { $this->generator->endIfCondition()->defIfCondition($branch->toLogicConditionCode($pathValue)); } elseif (!$conditionStarted) { // This is first inner branch // Start new condition $this->generator->defIfCondition($branch->toLogicConditionCode($pathValue)); // Set flag that condition has started $conditionStarted = true; } else { // This is regular branching $this->generator->defElseIfCondition($branch->toLogicConditionCode($pathValue)); } // Second stage receive parameters if ($branch->isParametrized()) { // Store parameter value received from condition $this->generator->newLine($branch->storeMatchedParameter()); } /** * Optimization to remove nested string operations - we create temporary $path variables */ $pathVariable = '$path' . mt_rand(0, 99999); // Do not output new $path variable creation if this is logic end if (count($branch->branches)) { $this->generator->newLine($pathVariable . ' = ' . $branch->removeMatchedPathCode($pathValue) . ';'); } // We should subtract part of $path var to remove this parameter // Go deeper in recursion $this->innerGenerate2($branch, $pathVariable, false); }
/** * Generate routing conditions logic. * * @param Branch $parent Current branch in resursion * @param string $pathValue Current $path value in routing logic * @param bool $conditionStarted Flag that condition started */ protected function innerGenerate2(Branch $parent, $pathValue = '$path', $conditionStarted = false) { // Iterate inner branches foreach ($parent->branches as $branch) { // First stage - open condition // If we have started condition branching but this branch has parameters if ($conditionStarted && $branch->isParametrized()) { $this->generator->endIfCondition()->defIfCondition($branch->toLogicConditionCode($pathValue)); } elseif (!$conditionStarted) { // This is first inner branch // Start new condition $this->generator->defIfCondition($branch->toLogicConditionCode($pathValue)); // Set flag that condition has started $conditionStarted = true; } else { // This is regular branching $this->generator->defElseIfCondition($branch->toLogicConditionCode($pathValue)); } // Second stage receive parameters if ($branch->isParametrized()) { // Store parameter value received from condition $this->generator->newLine($branch->storeMatchedParameter()); } /** * Optimization to remove nested string operations - we create temporary $path variables */ $pathVariable = '$path' . rand(0, 99999); // Do not output new $path variable creation if this is logic end if (sizeof($branch->branches)) { $this->generator->newLine($pathVariable . ' = ' . $branch->removeMatchedPathCode($pathValue) . ';'); } // We should subtract part of $path var to remove this parameter // Go deeper in recursion $this->innerGenerate2($branch, $pathVariable, false); } // Return route if branch has it if ($parent->hasRoute()) { // If we had other inner branch for this parent branch - we need to add else if (sizeof($parent->branches)) { $this->generator->defElseCondition(); } $this->generator->newLine($parent->returnRouteCode()); } // Close first condition if ($conditionStarted) { $this->generator->endIfCondition(); } }
/** * Build resolving method injection declaration. * * @param array $dependencies Collection of method dependencies * @param string $methodName Method name * @param string $containerVariable Container declaration variable name * @param string $reflectionVariable Reflection class variable name * @param bool $isPublic Flag if method is public */ protected function buildResolverMethodDeclaration(array $dependencies, string $methodName, string $containerVariable, string $reflectionVariable, bool $isPublic) { // Get method arguments $argumentsCount = count($dependencies); $this->generator->comment('Invoke ' . $methodName . '() and pass dependencies(y)'); if ($isPublic) { $this->generator->newLine($containerVariable . '->' . $methodName . '(')->increaseIndentation(); } else { $this->generator->newLine('$method = ' . $reflectionVariable . '->getMethod(\'' . $methodName . '\');')->newLine('$method->setAccessible(true);')->newLine('$method->invoke(')->increaseIndentation()->newLine($containerVariable . ','); } $i = 0; // Iterate method arguments foreach ($dependencies as $argument => $dependency) { // Add dependencies $this->buildResolverArgument($dependency); // Add comma if this is not last dependency if (++$i < $argumentsCount) { $this->generator->text(','); } } $this->generator->decreaseIndentation()->newLine(');'); }