protected function _readMetaData($model)
{
$modelName = is_string($model) ? $model : get_class($model);
if (!isset($this->_metadata[$modelName])) {
$data = $this->read($modelName);
if ($data !== false) {
$this->_metadata[$modelName] = $data;
} else {
if (is_string($model)) {
$model = new $model();
}
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
$data = $model->getReadConnection()->getMetadata($model->getSource());
$properties = [];
foreach ((new \ReflectionClass($model))->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
if (!$property->isStatic()) {
$properties[] = $property->getName();
}
}
$diff = array_diff($properties, $data[self::MODEL_ATTRIBUTES]);
if (count($diff) !== 0) {
throw new MetadataException('`:model` model is not contains `:columns` columns', ['model' => $modelName, 'columns' => implode(',', $diff)]);
}
$data[self::MODEL_COLUMN_PROPERTIES] = $properties;
$this->_metadata[$modelName] = $data;
$this->write($modelName, $data);
}
}
return $this->_metadata[$modelName];
}