/** * Generate virtual entity representation. * * @param ReflectionEntity $entity * @return ClassElement */ protected function renderEntity(ReflectionEntity $entity) { $element = new ClassElement($entity->getShortName()); //We are going to render every entity property as real property due child implementation //may clarify it's type foreach ($entity->getFields() as $field => $type) { if (substr($field, 0, 1) == '_') { //Hidden fields continue; } $classType = ''; $arrayType = false; if (is_array($type)) { $arrayType = true; $type = $type[0]; } $type = str_replace('[]', '', $type); if (lcfirst($type) != $type && class_exists($type)) { $type = $classType = '\\' . $type; } if ($arrayType) { $type .= '[]'; } $element->property($field, "@var {$type}")->setAccess(AbstractElement::ACCESS_PUBLIC); //Let's pre-generate getters and setters $setter = $element->method('set' . Inflector::classify($field)); $getter = $element->method('get' . Inflector::classify($field)); $setter->parameter($field, $type); if (!empty($arrayType)) { $setter->parameter($field)->setType('array'); } elseif (!empty($classType)) { $setter->parameter($field)->setType($classType); } $setter->setComment("@return \$this", true); $getter->setComment("@return {$type}"); } foreach ($entity->getAccessors() as $name => $accessor) { if (is_array($accessor)) { $accessor = $accessor[0]; } $element->property($name, '@var \\' . $accessor); $element->method('get' . Inflector::classify($name))->setComment("@return \\" . $accessor); } return $element; }
/** * @param RecordSchema $entity * @param ClassElement $element * @param ManyToMorphedSchema $relation */ protected function renderManyToMorphedRelation(RecordSchema $entity, ClassElement $element, ManyToMorphedSchema $relation) { //Rendering relation method $relationElement = new ClassElement($elementName = $this->createName($entity->getName(), $relation->getTarget(), 'relation')); //Clone schema from appropriate relation $relationClass = $this->builder->config()['relations'][$relation->getType()]['class']; $relationElement->cloneSchema($relationClass); $this->cleanElement($relationElement); $relationElement->setParent('\\' . $relationClass)->setInterfaces([]); //Let's render sub relations foreach ($relation->outerRecords() as $record) { $related = '\\' . $record->getName() . '[]'; if ($relation->isMultiple()) { $related .= '|' . $this->helper('iterator', $record->getName()); } $name = Inflector::pluralize($record->getRole()); $relationElement->property($name, "@var {$related}")->setAccess(AbstractElement::ACCESS_PUBLIC); //Nested relation $relationElement->method($name, ["@return " . $this->renderNestedMany($record)]); } $name = $relation->getTarget(); $relationElement->replaceComments(Record::class, $name); $relationElement->replaceComments("Record", '\\' . $name); $fullName = $this->addClass($relationElement); $element->property($relation->getName(), "@var {$fullName}")->setAccess(AbstractElement::ACCESS_PUBLIC); $element->method($relation->getName(), "@return {$fullName}"); }