AssociationDecorator.php 2.51 KiB
<?php
/*
 * © 2016 IRSTEA
 * Guillaume Perréal <guillaume.perreal@irstea.fr>
 * 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 <guillaume.perreal@irstea.fr>
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:
717273747576777879808182838485
$sourceCardinality = '*'; $targetCardinality = '*'; break; case ClassMetadata::MANY_TO_ONE: $sourceCardinality = '*'; $targetCardinality = '1'; break; } $node->addArrow( new BaseArrow($node, $target, "--", $association["fieldName"]." >", $linkSource, $linkTarget, $sourceCardinality, $targetCardinality) ); } }