/** * Přidává k metadatům entity rozšiřující vazby * * @param string * @param MetaData * @return MetaData */ public function completeMetaData($targetEntityClass, MetaData $metaData) { // kompletujeme relace i pro všechny předky entity $classes = $this->getClasses($targetEntityClass); $relations = array(); foreach ($classes as $class) { $relations = $relations + $this->getRelations($class); } $properties = $metaData->toArray(); // 0 type // 1 property // 2 relationType // 3 repositoryClass // 4 opositProperty foreach ($relations as $data) { if (isset($properties[$data[1]])) { continue; } if ($data[2] === MetaData::OneToMany) { $metaData->addProperty($data[1], $data[0])->setOneToMany($data[3], $data[4]); } elseif ($data[2] === MetaData::ManyToMany) { $metaData->addProperty($data[1], $data[0])->setManyToMany($data[3], $data[4], RelationshipMetaDataToMany::MAPPED_THERE); } else { throw new InvalidArgumentException("Pouze relace '1:m' a 'm:m' může být přiřazdena entitě rozšiřijící entitou. Uvedenou relaci '{$data['2']}' nelze přidat."); } } return $metaData; }
/** * @param MetaData * @param string * @param MetaData::READWRITE|MetaData::READ|MetaData::WRITE * @param string */ private function addProperty(MetaData $metaData, $string, $mode, $class) { if ($mode === MetaData::READWRITE) { if (preg_match('#^(-read|-write)?\\s?(.*)$#si', $string, $match)) { $mode = $match[1]; $mode = ((!$mode or $mode === '-read') ? MetaData::READ : 0) | ((!$mode or $mode === '-write') ? MetaData::WRITE : 0); $string = $match[2]; } } if (preg_match('#^([a-z0-9_\\|\\\\]+)\\s+\\$([a-z0-9_]+)($|\\s(.*)$)#si', $string, $match)) { $property = $match[2]; $type = $match[1]; $string = $match[3]; } else { if (preg_match('#^\\$([a-z0-9_]+)\\s+([a-z0-9_\\|\\\\]+)($|\\s(.*)$)#si', $string, $match)) { $property = $match[1]; $type = $match[2]; $string = $match[3]; } else { if (preg_match('#^\\$([a-z0-9_]+)($|\\s(.*)$)#si', $string, $match)) { $property = $match[1]; $type = 'mixed'; $string = $match[2]; } else { $tmp = $mode === MetaData::READ ? '-read' : ''; throw new AnnotationMetaDataException("Invalid annotation format '@property{$tmp} {$string}' in {$class}"); } } } $propertyName = $property; $property = $metaData->addProperty($propertyName, $type, $mode, $class); $this->property = array($propertyName, $property); $string = preg_replace_callback('#\\{\\s*([^\\s\\}\\{]+)(?:\\s+([^\\}\\{]*))?\\s*\\}#si', array($this, 'callOnMacro'), $string); $this->property = NULL; if (preg_match('#\\{|\\}#', $string)) { $string = trim($string); throw new AnnotationMetaDataException("Invalid annotation format, extra curly bracket '{$string}' in {$class}::\${$propertyName}"); } }
/** * @param MetaData $metaData * @param string $string * @param string $mode ::READWRITE|MetaData::READ|MetaData::WRITE * @param string $class * @param ReflectionClass $r */ private function addProperty(MetaData $metaData, $string, $mode, $class, ReflectionClass $r) { if ($mode === MetaData::READWRITE) { if (preg_match('#^(-read|-write)?\\s?(.*)$#si', $string, $match)) { $mode = $match[1]; $mode = ((!$mode or $mode === '-read') ? MetaData::READ : 0) | ((!$mode or $mode === '-write') ? MetaData::WRITE : 0); $string = $match[2]; } } if (preg_match('#^([a-z0-9_\\[\\]\\|\\\\]+)\\s+\\$([a-z0-9_]+)($|\\s(.*)$)#si', $string, $match)) { $property = $match[2]; $type = $match[1]; $string = $match[3]; } else { if (preg_match('#^\\$([a-z0-9_]+)\\s+([a-z0-9_\\|\\\\]+)($|\\s(.*)$)#si', $string, $match)) { $property = $match[1]; $type = $match[2]; $string = $match[3]; } else { if (preg_match('#^\\$([a-z0-9_]+)($|\\s(.*)$)#si', $string, $match)) { $property = $match[1]; $type = 'mixed'; $string = $match[2]; } else { $tmp = $mode === MetaData::READ ? '-read' : ''; throw new AnnotationMetaDataException("Invalid annotation format '@property{$tmp} {$string}' in {$class}"); } } } if (strpos(strToLower($string), '{ignore}') !== FALSE) { return; } $propertyName = $property; // Support for simplified FQN '@property Foo' instead of '@property \App\Foo' $parts = explode('|', $type); foreach ($parts as &$part) { $fqn = NetteAnnotationsParser::expandClassName($part, $r); if (class_exists($fqn)) { $part = $fqn; } if ($part === Orm\OneToMany::class) { // Support for '@property OtM|Foo[]' instead of '@property Orm\OneToMany' $parts = [Orm\OneToMany::class]; break; } else { if ($part === Orm\ManyToMany::class) { // Support for '@property MtM|Foo[]' instead of '@property Orm\ManyToMany' $parts = [Orm\ManyToMany::class]; break; } else { if (substr($part, -2) === '[]') { $part = 'array'; } } } } $type = implode('|', $parts); $property = $metaData->addProperty($propertyName, $type, $mode, $class); $this->property = [$propertyName, $property]; $string = preg_replace_callback('#\\{\\s*([^\\s\\}\\{]+)(?:\\s+([^\\}\\{]*))?\\s*\\}#si', [$this, 'callOnMacro'], $string); $this->property = NULL; if (preg_match('#\\{|\\}#', $string)) { $string = trim($string); throw new AnnotationMetaDataException("Invalid annotation format, extra curly bracket '{$string}' in {$class}::\${$propertyName}"); } }