08 Метаданные модели
Для ускорения разработки Phalcon\Mvc\Model позволяет запрашивать поля и ограничения из таблиц, связанных с моделями. Для этого, Phalcon\Mvc\Model\MetaData позволяет управлять и кэшировать метаданные таблицы.
Иногда необходимо получить эти атрибуты при работе с моделями. Экземпляр метаданных можно получить следующим образом:
<?php $robot = new Robots(); // Получаем экземпляр Phalcon\Mvc\Model\Metadata $metadata = $robot->getModelsMetaData(); // Получаем имена полей робота $attributes = $metadata->getAttributes($robot); print_r($attributes); // Получаем типы данных полей робота $dataTypes = $metadata->getDataTypes($robot); print_r($dataTypes);
Кэширование метаданных
После того как приложение переведено в продакшн режим, нет необходимости запрашивать метаданные таблицы из базы данных каждый раз, когда вы используете таблицу. В таком случае можно задействовать кэширование метаданных, используя любой из следующих адаптеров:
| Адаптер | Описание | API |
|---|---|---|
| Apc | Этот адаптер использует Alternative PHP Cache (APC) для хранения таблицы метаданных. Вы можете задать время жизни метаданных с помощью параметров. Рекомендуемый способ хранения метаданных, когда приложение находится в продакшн режиме. | Phalcon\Mvc\Model\MetaData\Apc |
| Files | Этот адаптер использует простые файлы для хранения метаданных. Этот адаптер уменьшает запросы к базе данных, но имеет увеличенный ввод-вывод с файловой системой. | Phalcon\Mvc\Model\MetaData\Files |
| Libmemcached | Этот адаптер использует сервер Memcached для хранения таблицы метаданных. Параметры сервера, а также время жизни кэша указываются в параметрах. Рекомендуемый способ хранения метаданных, когда приложение находится в продакшн режиме. | Phalcon\Mvc\Model\MetaData\Libmemcached |
| Memcache | Этот адаптер использует Memcache для хранения метаданных таблицы. Вы можете задать время жизни метаданных с помощью параметров. Рекомендуемый способ хранения метаданных, когда приложение находится в продакшн режиме. | Phalcon\Mvc\Model\MetaData\Memcache |
| Memory | Это адаптер по умолчанию. Метаданные кэшируются только на время выполнения запроса. По завершении запроса память, выделенная под метаданные, освобождается. Рекомендуемый способ хранения метаданных, когда приложение находится в стадии разработки. | Phalcon\Mvc\Model\MetaData\Memory |
| Redis | Этот адаптер использует Redis для хранения метаданных таблицы. Параметры сервера, а также время жизни кэша указываются в параметрах. Рекомендуемый способ хранения метаданных, когда приложение находится в продакшн режиме. | Phalcon\Mvc\Model\MetaData\Redis |
| Session | Этот адаптер сохраняет метаданные в суперглобальной переменной $_SESSION. Данный адаптер рекомендуется использовать только при небольшом количестве моделей. Метаданные обновляются каждый раз, когда начинается новая сессия. При этом перед использованием любой модели необходимо начать сессию с помощью функции session_start(). |
Phalcon\Mvc\Model\MetaData\Session |
| XCache | Этот адаптер использует XCache для хранения таблицы метаданных. Вы можете задать время жизни метаданных с помощью параметров. Это один из рекомендуемых способов для хранения метаданных, когда приложение находится в продакшн режиме. | Phalcon\Mvc\Model\MetaData\Xcache |
Как и другие зависимости ORM, менеджер метаданных запрашивается из контейнера сервисов:
<?php
use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
$di['modelsMetadata'] = function () {
// Создаём менеджер метаданных с APC
$metadata = new ApcMetaData(
[
'lifetime' => 86400,
'prefix' => 'my-prefix',
]
);
return $metadata;
};
Стратегии метаданных
Как уже упоминалось выше, стратегией по умолчанию для получения метаданных модели является интроспекция базы данных. В этой стратегии используется информационная схема, чтобы узнать поля таблицы, ее первичный ключ, обнуляемые поля, типы данных и т. д.
Вы можете изменить стандартную интроспекцию метаданных следующим образом:
<?php
use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
$di['modelsMetadata'] = function () {
// Создаём адаптер метаданных
$metadata = new ApcMetaData(
[
'lifetime' => 86400,
'prefix' => 'my-prefix',
]
);
// Изменяем стратегию интроспекции метаданных
$metadata->setStrategy(
new MyIntrospectionStrategy()
);
return $metadata;
};
Стратегия интроспекции базы данных
Эта стратегия не требует какой-либо настройки и неявно используется всеми адаптерами метаданных.
Стратегия Аннотаций
Эта стратегия позволяет использовать аннотации <annotations> для описания столбцов в модели:
<?php
use Phalcon\Mvc\Model;
class Robots extends Model
{
/**
* @Primary
* @Identity
* @Column(type='integer', nullable=false)
*/
public $id;
/**
* @Column(type='string', length=70, nullable=false)
*/
public $name;
/**
* @Column(type='string', length=32, nullable=false)
*/
public $type;
/**
* @Column(type='integer', nullable=false)
*/
public $year;
}
Аннотации должны размещаться в свойствах, сопоставленных столбцам в сопоставленном источнике. Свойства без аннотации @Column обрабатываются как простые атрибуты класса.
Поддерживаются следующие аннотации:
| Название | Описание |
|---|---|
| Primary | Отмечает поле как часть первичного ключа таблицы |
| Identity | Поле является автоинкрементным и/или идентифицирующим |
| Column | Отмечает атрибут в качестве отображаемого столбца |
Аннотация @Column поддерживает следующие параметры:
| Название | Описание |
|---|---|
| column | Реальное имя столбца |
| type | Типы столбцов: varchar/string (default), text, char, json, tinyblob, blob, mediumblob, longblob, integer, biginteger, float, decimal, date, datetime, timestamp, boolean |
| length | Длина столбца, если есть |
| nullable | Принимает ли столбец нулевые значения или нет |
| skip_on_insert | Пропустить этот столбец при вставке |
| skip_on_update | Пропустить этот столбец при обновлении |
| allow_empty_string | Столбец допускает пустые строки |
| default | Значение по умолчанию |
Стратегия аннотаций может быть задана таким образом:
<?php
use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
use Phalcon\Mvc\Model\MetaData\Strategy\Annotations as StrategyAnnotations;
$di['modelsMetadata'] = function () {
// Создаём адаптер метаданных
$metadata = new ApcMetaData(
[
'lifetime' => 86400,
'prefix' => 'my-prefix',
]
);
// Изменяем стратегию интроспекции метаданных
$metadata->setStrategy(
new StrategyAnnotations()
);
return $metadata;
};
Установка метаданных вручную
Phalcon может получить метаданные для каждой модели автоматически, без необходимости их ручной установки с помощью любой из стратегий интроспекции, представленных выше.
Разработчик также имеет возможность определить метаданные вручную. Эта стратегия перекрывает любые другие, заданные в менеджере метаданных. При добавлении/изменении/удалении столбцов в связанной таблице информация о них также должна быть добавлена/изменена/удалена в модели.
Следующий пример показывает, как определить метаданные вручную:
<?php
use Phalcon\Mvc\Model;
use Phalcon\Db\Column;
use Phalcon\Mvc\Model\MetaData;
class Robots extends Model
{
public function metaData()
{
return array(
// Столбцы в отображаемой таблице
MetaData::MODELS_ATTRIBUTES => [
'id',
'name',
'type',
'year',
],
// Столбцы, являющиеся частью первичного ключа
MetaData::MODELS_PRIMARY_KEY => [
'id',
],
// Столбцы, которые не являются частью первичного ключа
MetaData::MODELS_NON_PRIMARY_KEY => [
'name',
'type',
'year',
],
// Столбцы, которые не позволяют хранить нулевые значения
MetaData::MODELS_NOT_NULL => [
'id',
'name',
'type',
],
// Все столбцы и их типы данных
MetaData::MODELS_DATA_TYPES => [
'id' => Column::TYPE_INTEGER,
'name' => Column::TYPE_VARCHAR,
'type' => Column::TYPE_VARCHAR,
'year' => Column::TYPE_INTEGER,
],
// Стобцы, которые имеют числовые типы данных
MetaData::MODELS_DATA_TYPES_NUMERIC => [
'id' => true,
'year' => true,
],
// Столбец идентификатора. Используйте логическое значение FALSE,
// если модель не имеет столбца идентификации
MetaData::MODELS_IDENTITY_COLUMN => 'id',
// К какому типу приводить каждый столбец
MetaData::MODELS_DATA_TYPES_BIND => [
'id' => Column::BIND_PARAM_INT,
'name' => Column::BIND_PARAM_STR,
'type' => Column::BIND_PARAM_STR,
'year' => Column::BIND_PARAM_INT,
],
// Поля, которые должны быть проигнорированы в INSERT SQL инструкциях
MetaData::MODELS_AUTOMATIC_DEFAULT_INSERT => [
'year' => true,
],
// Поля, которые должны быть проигнорированы в UPDATE SQL инструкциях
MetaData::MODELS_AUTOMATIC_DEFAULT_UPDATE => [
'year' => true,
],
// Значения по умолчанию для столбцов
MetaData::MODELS_DEFAULT_VALUES => [
'year' => '2015',
],
// Поля, допускающие пустые строки
MetaData::MODELS_EMPTY_STRING_VALUES => [
'name' => true,
],
);
}
}