Вход Регистрация
Файл: symfony-2.7/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php
Строк: 191
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyBridgeDoctrineForm;

use 
DoctrineCommonPersistenceManagerRegistry;
use 
DoctrineORMMappingClassMetadataInfo;
use 
DoctrineCommonPersistenceMappingMappingException;
use 
DoctrineORMMappingMappingException as LegacyMappingException;
use 
SymfonyComponentFormFormTypeGuesserInterface;
use 
SymfonyComponentFormGuessGuess;
use 
SymfonyComponentFormGuessTypeGuess;
use 
SymfonyComponentFormGuessValueGuess;
use 
DoctrineCommonUtilClassUtils;

class 
DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
{
    protected 
$registry;

    private 
$cache = array();

    public function 
__construct(ManagerRegistry $registry)
    {
        
$this->registry $registry;
    }

    
/**
     * {@inheritdoc}
     */
    
public function guessType($class$property)
    {
        if (!
$ret $this->getMetadata($class)) {
            return new 
TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
        }

        list(
$metadata$name) = $ret;

        if (
$metadata->hasAssociation($property)) {
            
$multiple $metadata->isCollectionValuedAssociation($property);
            
$mapping $metadata->getAssociationMapping($property);

            return new 
TypeGuess('entity', array('em' => $name'class' => $mapping['targetEntity'], 'multiple' => $multiple), Guess::HIGH_CONFIDENCE);
        }

        switch (
$metadata->getTypeOfField($property)) {
            case 
'array':
                return new 
TypeGuess('collection', array(), Guess::MEDIUM_CONFIDENCE);
            case 
'boolean':
                return new 
TypeGuess('checkbox', array(), Guess::HIGH_CONFIDENCE);
            case 
'datetime':
            case 
'vardatetime':
            case 
'datetimetz':
                return new 
TypeGuess('datetime', array(), Guess::HIGH_CONFIDENCE);
            case 
'date':
                return new 
TypeGuess('date', array(), Guess::HIGH_CONFIDENCE);
            case 
'time':
                return new 
TypeGuess('time', array(), Guess::HIGH_CONFIDENCE);
            case 
'decimal':
            case 
'float':
                return new 
TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE);
            case 
'integer':
            case 
'bigint':
            case 
'smallint':
                return new 
TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE);
            case 
'string':
                return new 
TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE);
            case 
'text':
                return new 
TypeGuess('textarea', array(), Guess::MEDIUM_CONFIDENCE);
            default:
                return new 
TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function guessRequired($class$property)
    {
        
$classMetadatas $this->getMetadata($class);

        if (!
$classMetadatas) {
            return;
        }

        
/** @var ClassMetadataInfo $classMetadata */
        
$classMetadata $classMetadatas[0];

        
// Check whether the field exists and is nullable or not
        
if ($classMetadata->hasField($property)) {
            if (!
$classMetadata->isNullable($property)) {
                return new 
ValueGuess(trueGuess::HIGH_CONFIDENCE);
            }

            return new 
ValueGuess(falseGuess::MEDIUM_CONFIDENCE);
        }

        
// Check whether the association exists, is a to-one association and its
        // join column is nullable or not
        
if ($classMetadata->isAssociationWithSingleJoinColumn($property)) {
            
$mapping $classMetadata->getAssociationMapping($property);

            if (!isset(
$mapping['joinColumns'][0]['nullable'])) {
                
// The "nullable" option defaults to true, in that case the
                // field should not be required.
                
return new ValueGuess(falseGuess::HIGH_CONFIDENCE);
            }

            return new 
ValueGuess(!$mapping['joinColumns'][0]['nullable'], Guess::HIGH_CONFIDENCE);
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function guessMaxLength($class$property)
    {
        
$ret $this->getMetadata($class);
        if (
$ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
            
$mapping $ret[0]->getFieldMapping($property);

            if (isset(
$mapping['length'])) {
                return new 
ValueGuess($mapping['length'], Guess::HIGH_CONFIDENCE);
            }

            if (
in_array($ret[0]->getTypeOfField($property), array('decimal''float'))) {
                return new 
ValueGuess(nullGuess::MEDIUM_CONFIDENCE);
            }
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function guessPattern($class$property)
    {
        
$ret $this->getMetadata($class);
        if (
$ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
            if (
in_array($ret[0]->getTypeOfField($property), array('decimal''float'))) {
                return new 
ValueGuess(nullGuess::MEDIUM_CONFIDENCE);
            }
        }
    }

    protected function 
getMetadata($class)
    {
        
// normalize class name
        
$class ClassUtils::getRealClass(ltrim($class'\'));

        if (array_key_exists($class, $this->cache)) {
            return $this->cache[$class];
        }

        $this->cache[$class] = null;
        foreach ($this->registry->getManagers() as $name => $em) {
            try {
                return $this->cache[$class] = array($em->getClassMetadata($class), $name);
            } catch (MappingException $e) {
                // not an entity or mapped super class
            } catch (LegacyMappingException $e) {
                // not an entity or mapped super class, using Doctrine ORM 2.2
            }
        }
    }
}
Онлайн: 3
Реклама