/** * Constructor * * @param AbstractEntity $entity An entity */ public function __construct(AbstractEntity $entity) { $this->position = 0; $this->entity = $entity; $this->refl = $entity->_getReflectionClass(); $this->refProps = new ArrayObject(array()); $this->primaryKey = array(); $entityAnnotation = $entity->getEntityAnnotation(); $fieldsIterator = array(); $pos = 0; $properties = $this->refl->getProperties(ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PUBLIC); $staticProperties = $this->refl->getProperties(ReflectionProperty::IS_STATIC); foreach (array_diff($properties, $staticProperties) as $refProp) { /* @var $refProp \ReflectionProperty */ /* @var $field \Scalr\Model\Loader\Field */ if (substr($refProp->name, 0, 1) != '_') { if (!isset(self::$cache[$this->refl->name][$refProp->name])) { //executes only once $loader = \Scalr::getContainer()->get('model.loader'); $loader->load($refProp); $field = $refProp->annotation; $field->setEntityAnnotation($entityAnnotation); $typeClass = __NAMESPACE__ . '\\Type\\' . ucfirst($field->column->type) . 'Type'; $refProp->annotation->setType(new $typeClass($field)); self::$cache[$refProp->class][$refProp->name] = $field; unset($field); } $refProp->annotation = self::$cache[$refProp->class][$refProp->name]; $fieldsIterator[$refProp->annotation->name] = $refProp->annotation; if (isset($refProp->annotation->id)) { $this->primaryKey[] = $refProp->name; } if (isset($refProp->annotation->generatedValue->strategy) && $refProp->annotation->generatedValue->strategy == GeneratedValue::STRATEGY_AUTO) { $this->autogenerated = $refProp->annotation; } $this->refProps->append($refProp); $this->propertyPositions[$refProp->name] = $pos++; } } $this->_fieldsIterator = new ArrayIterator($fieldsIterator); }