/** * Gets the commit order for all the classes available via the provided {@see ClassMetadataFactory} * * @param ClassMetadataFactory $mdf * * @return \string[] */ public static function getCommitOrderFromMetadata(ClassMetadataFactory $mdf) { $cd = $mdf->getCacheDriver(); if ($cd->contains(self::CACHE_KEY)) { return $cd->fetch(self::CACHE_KEY); } $co = new self(); /** @var ClassMetadata $class */ foreach ($mdf->getAllMetadata() as $class) { $co->classes[$class->name] = $class; foreach ($class->associationMappings as $assoc) { if (!isset($assoc['reference']) || !isset($assoc['targetDoc'])) { continue; } /** @var ClassMetadata $dependency */ $dependency = $mdf->getMetadataFor($assoc['targetDoc']); if (!$co->hasDependency($dependency, $class)) { $co->addDependency($dependency, $class); } // If the target class has mapped subclasses, these share the same dependency. // if ( ! $targetClass->subClasses) { // continue; // } // // foreach ($targetClass->subClasses as $subClassName) { // $targetSubClass = $this->dm->getClassMetadata($subClassName); // // if ( ! $calc->hasClass($subClassName)) { // $calc->addClass($targetSubClass); // // $newNodes[] = $targetSubClass; // } // // $calc->addDependency($targetSubClass, $class); // } } } $ordered = $co->getCommitOrder(); $cd->save(self::CACHE_KEY, $ordered); return $ordered; }
/** * {@inheritdoc} */ public static function fromArray(array $values) { $message = new self(); $values = array_merge(['name' => null, 'package' => null, 'dependency' => [], 'public_dependency' => [], 'weak_dependency' => [], 'message_type' => [], 'enum_type' => [], 'service' => [], 'extension' => [], 'options' => null, 'source_code_info' => null, 'syntax' => null], $values); $message->setName($values['name']); $message->setPackage($values['package']); $message->setOptions($values['options']); $message->setSourceCodeInfo($values['source_code_info']); $message->setSyntax($values['syntax']); foreach ($values['dependency'] as $item) { $message->addDependency($item); } foreach ($values['public_dependency'] as $item) { $message->addPublicDependency($item); } foreach ($values['weak_dependency'] as $item) { $message->addWeakDependency($item); } foreach ($values['message_type'] as $item) { $message->addMessageType($item); } foreach ($values['enum_type'] as $item) { $message->addEnumType($item); } foreach ($values['service'] as $item) { $message->addService($item); } foreach ($values['extension'] as $item) { $message->addExtension($item); } return $message; }