/** * @param ActiveRow $activeRow * @param $tableName * @throws InvalidStateException * @return HyperRow */ public function createRow(ActiveRow $activeRow, $tableName) { $className = Helpers::substituteClassWildcard($this->rowMapping, $tableName); $baseClass = HyperRow::class; if (!class_exists($className) || !is_subclass_of($className, $baseClass)) { throw new InvalidStateException("HyperRow class {$className} does not exist or does not extend {$baseClass}."); } $names = $this->container->findByType($className); if (count($names) > 1) { throw new InvalidStateException("Multiple services of type {$className} found: " . implode(', ', $names) . '.'); } elseif (count($names) == 0) { $inst = $this->container->createInstance($className); } else { $name = array_shift($names); $inst = $this->container->createService($name); } /** @var HyperRow $inst */ $inst->setFactory($this); $inst->setActiveRow($activeRow); return $inst; }
/** * Returns properly formatted FQN with backslash at the beginning or class name if the provided $fqn * has the same namespace as $contextClassNamespace * * @param string $fqn * @param string $contextClassNamespace * @return string */ public static function formatClassName($fqn, $contextClassNamespace) { $result = Helpers::extractClassName($fqn); $classNamespace = Helpers::extractNamespace($fqn); if ($classNamespace != $contextClassNamespace) { $result = $fqn; if (!Strings::startsWith($result, '\\')) { $result = '\\' . $result; } } return $result; }
/** * @param string $type selection|row * @param string $tableName */ protected function generateTableClass($type, $tableName) { $classFqn = $this->config['classes'][$type]['mapping']; $classFqn = Helpers::substituteClassWildcard($classFqn, $tableName); $className = Helpers::extractClassName($classFqn); $classNamespace = Helpers::extractNamespace($classFqn); $extendsFqn = $this->config['classes'][$type]['generated']; $extendsFqn = Helpers::substituteClassWildcard($extendsFqn, $tableName); $extends = Helpers::formatClassName($extendsFqn, $classNamespace); $dir = $this->config['dir'] . '/' . 'tables' . '/' . $tableName; $this->generateEmptyClass($classNamespace, $className, $extends, $dir); }