public static function defineClass($className, $extends = '') { // $namespace = 'Eddmash\PowerOrm\Migration\Model'; $namespace = ''; $use = ''; $extendedClass = ''; if (empty($extends) || Model::isModelBase($extends)) { $extends = Model::getFullClassName(); } else { $extendedClass = sprintf('%s%s', ClassHelper::getFormatNamespace($namespace, true), $extends); $use = sprintf('use %s;', $extendedClass); $extends = trim(substr($extends, strripos($extends, '\\')), '\\'); } if (!StringHelper::isEmpty($extendedClass) && !ClassHelper::classExists($extendedClass, $namespace)) { self::$deferedClasses[$extends][] = ['class' => $className, 'extends' => $extends]; return false; } $extends = ClassHelper::getNameFromNs($extends, $namespace); $class = sprintf(self::getTemplate(), $namespace, $use, $className, $extends); $className = sprintf('%s%s', ClassHelper::getFormatNamespace($namespace, true), $className); if (ArrayHelper::hasKey(self::$deferedClasses, $className)) { foreach (self::$deferedClasses[$className] as $deferedClass) { self::defineClass($deferedClass['class'], $deferedClass['extends']); } } if (!ClassHelper::classExists($className, $namespace)) { eval($class); } return $className; }
/** * @ignore * * @return string */ public function __toString() { return $this->scopeModel->getFullClassName() . '->' . $this->name; }
/** * Add the current object to the passed in object. * * @param string $propertyName the name map the current object to, in the class object passed in * @param Model $classObject the object to attach the current object to * * @since 1.1.0 * * @author Eddilbert Macharia (http://eddmash.com) <*****@*****.**> */ public function contributeToClass($propertyName, $classObject) { $classObject->{$propertyName} = $this; $this->modelName = $this->getName($classObject->getFullClassName()); $this->scopeModel = $classObject; // override with the configs now. foreach (static::$DEFAULT_NAMES as $defaultName) { if (ArrayHelper::hasKey($this->overrides, $defaultName)) { $this->{$defaultName} = $this->overrides[$defaultName]; } } if ($this->dbTable == null) { $this->dbTable = $this->_getTableName(); } $vName = $this->verboseName; $this->verboseName = empty($vName) ? ucwords(StringHelper::camelToSpace($this->modelName)) : $vName; }
/** * Creates an intermediary model. * * @param ManyToManyField $field * @param Model $model * * @return Model * * @since 1.1.0 * * @author Eddilbert Macharia (http://eddmash.com) <*****@*****.**> */ public function createManyToManyIntermediaryModel($field, $model) { $modelName = $model->meta->modelName; if (is_string($field->relation->toModel)) { $toModelName = Tools::resolveRelation($model, $field->relation->toModel); } else { $toModelName = $field->relation->toModel->meta->modelName; } $className = sprintf('%1$s_%2$s', $modelName, $field->name); $intermediaryClass = 'class %1$s extends %2$s{ public function fields(){} }'; $intermediaryClass = sprintf($intermediaryClass, $className, Model::getFullClassName()); if (!class_exists($className, false)) { eval($intermediaryClass); } $from = strtolower($modelName); $to = strtolower($toModelName); if ($from == $to) { $to = sprintf('to_%s', $to); $from = sprintf('from_%s', $from); } $fields = [$from => ForeignKey::createObject(['to' => $modelName, 'dbConstraint' => $field->relation->dbConstraint, 'onDelete' => Delete::CASCADE]), $to => ForeignKey::createObject(['to' => $toModelName, 'dbConstraint' => $field->relation->dbConstraint, 'onDelete' => Delete::CASCADE])]; $meta = ['dbTable' => $field->_getM2MDbTable($model->meta), 'verboseName' => sprintf('%s-%s relationship', $from, $to), 'uniqueTogether' => [$from, $to], 'autoCreated' => true]; $className = '\\' . $className; /** @var $intermediaryObj Model */ $intermediaryObj = new $className(); $intermediaryObj->init($fields, ['meta' => $meta, 'registry' => $field->scopeModel->meta->registry]); return $intermediaryObj; }