* Tous droits réservés. */ namespace Irstea\PlantUmlBundle\Doctrine; use Doctrine\ORM\Mapping\ClassMetadata; use Irstea\PlantUmlBundle\Model\Arrow\BaseArrow; use Irstea\PlantUmlBundle\Model\ClassVisitorInterface; use Irstea\PlantUmlBundle\Model\Node\Member\Member; use Irstea\PlantUmlBundle\Model\NodeInterface; use ReflectionClass; /** * Description of RelationDecorator * * @author Guillaume Perréal */ class AssociationDecorator extends AbstractDoctrineDecorator { use \Irstea\PlantUmlBundle\Model\Decorator\InheritableItemDecoratorTrait; protected function extractItems(ReflectionClass $class) { return $this->withMetadata( function ($metadata) { return $metadata->getAssociationMappings(); }, $class ); } protected function decorateItem(ReflectionClass $class, NodeInterface $node, ClassVisitorInterface $visitor, $association) { if (!$association['isOwningSide']) { return; } $target = $visitor->visitClass($association['targetEntity']); if ($target === false) { $type = $association['targetEntity']; if ($association["type"] & ClassMetadata::TO_MANY != 0) { $type .= '[]'; } $node->addAttribute(new Member($association['fieldName'], $type)); return; } $linkSource = ''; $linkTarget = ">"; if ($association["isCascadeRemove"]) { $linkSource = "o"; } $sourceCardinality = ""; $targetCardinality = ""; switch($association["type"]) { case ClassMetadata::ONE_TO_ONE: $sourceCardinality = '1'; $targetCardinality = '1'; break; case ClassMetadata::ONE_TO_MANY: $sourceCardinality = '1'; $targetCardinality = '*'; break; case ClassMetadata::MANY_TO_MANY: $sourceCardinality = '*'; $targetCardinality = '*'; break; case ClassMetadata::MANY_TO_ONE: $sourceCardinality = '*'; $targetCardinality = '1'; break; } $node->addArrow( new BaseArrow($node, $target, "--", $association["fieldName"]." >", $linkSource, $linkTarget, $sourceCardinality, $targetCardinality) ); } public function toConfig(array &$conf) { $conf['decorators'][] = 'associations'; } }