public function testFactoryGenericWithData() { CM_Config::get()->CM_Model_Abstract->types[CM_ModelMock::getTypeStatic()] = 'CM_ModelMock'; $modelMock1 = CM_ModelMock::createStatic(array('foo' => 'bar')); /** @var CM_ModelMock $modelMock2 */ $modelMock2 = CM_Model_Abstract::factoryGeneric(CM_ModelMock::getTypeStatic(), $modelMock1->getIdRaw(), array('foo' => 'bla')); $this->assertSame('bla', $modelMock2->getFoo()); }
/** * @param string $key * @param mixed $value * @return mixed * @throws CM_Exception_Invalid * @throws CM_Model_Exception_Validation */ public function decodeField($key, $value) { $key = (string) $key; if ($this->hasField($key)) { $schemaField = $this->_schema[$key]; if (null !== $value) { $type = isset($schemaField['type']) ? $schemaField['type'] : null; if (null !== $type) { switch ($type) { case 'integer': case 'int': $value = (int) $value; break; case 'float': $value = (double) $value; break; case 'string': break; case 'boolean': case 'bool': $value = (bool) $value; break; case 'array': break; case 'DateTime': $value = DateTime::createFromFormat('U', $value); break; default: $id = CM_Params::jsonDecode($value); if (!is_array($id)) { $id = array('id' => $id); } $value = CM_Model_Abstract::factoryGeneric($type::getTypeStatic(), $id); } } } } return $value; }
/** * @param CM_Model_Abstract $model */ public static function reinstantiateModel(CM_Model_Abstract &$model) { $model = CM_Model_Abstract::factoryGeneric($model->getType(), $model->getIdRaw()); }
/** * @param string $key * @param mixed $value * @return mixed * @throws CM_Exception_Invalid * @throws CM_Model_Exception_Validation */ public function decodeField($key, $value) { $key = (string) $key; if ($this->hasField($key)) { $schemaField = $this->_schema[$key]; if (null !== $value) { $type = isset($schemaField['type']) ? $schemaField['type'] : null; if (null !== $type) { switch ($type) { case 'integer': case 'int': $value = (int) $value; break; case 'float': $value = (double) $value; break; case 'string': $value = (string) $value; break; case 'boolean': case 'bool': $value = (bool) $value; break; case 'array': break; case 'DateTime': $value = DateTime::createFromFormat('U', $value); break; default: if (!class_exists($type)) { throw new CM_Model_Exception_Validation('Field type is not a valid class/interface', null, ['type' => $type]); } $className = $type; if (is_a($className, 'CM_Model_Abstract', true)) { /** @var CM_Model_Abstract $type */ if ($this->_isJson($value)) { $value = CM_Util::jsonDecode($value); } $id = $value; if (!is_array($id)) { $id = ['id' => $id]; } $value = CM_Model_Abstract::factoryGeneric($type::getTypeStatic(), $id); } elseif (is_subclass_of($className, 'CM_ArrayConvertible', true)) { /** @var CM_ArrayConvertible $className */ $value = CM_Util::jsonDecode($value); $value = $className::fromArray($value); } else { throw new CM_Model_Exception_Validation('Class is neither CM_Model_Abstract nor CM_ArrayConvertible', null, ['className' => $className]); } if (!$value instanceof $className) { throw new CM_Model_Exception_Validation('Value is not an instance of the class', null, ['value' => CM_Util::var_line($value), 'className' => $className]); } } } } } return $value; }