Spec-Zone.ru › Phalcon 3

Метаданные моделей

Для ускорения разработки Phalcon\Mvc\Model помогает вам получать поля и ограничения из таблиц, связанных с моделями. Для этого доступен Phalcon\Mvc\Model\MetaData для управления и кеширования метаданных таблиц.

Иногда необходимо получить эти атрибуты при работе с моделями. Вы можете получить экземпляр метаданных следующим образом:

$robot = new Robots();

// Get Phalcon\Mvc\Model\Metadata instance
$metadata = $robot->getModelsMetaData();

// Get robots fields names
$attributes = $metadata->getAttributes($robot);
print_r($attributes);

// Get robots fields data types
$dataTypes = $metadata->getDataTypes($robot);
print_r($dataTypes);

Кеширование метаданных

Когда приложение находится на стадии производства, нет необходимости каждый раз запрашивать метаданные таблицы из системы баз данных. Это можно сделать, кэшируя метаданные с помощью одного из следующих адаптеров:

Адаптер Описание API
Память Этот адаптер является стандартным. Метаданные кэшируются только во время запроса. По завершении запроса метаданные освобождаются как часть обычной памяти запроса. Этот адаптер идеально подходит для разработки, так как метаданные обновляются в каждом запросе, содержащем новые и/или измененные поля. Phalcon\Mvc\Model\MetaData\Memory
Сессия Этот адаптер хранит метаданные в $_SESSION суперглобальной переменной. Этот адаптер рекомендуется только в том случае, если приложение действительно использует небольшое количество моделей. Метаданные обновляются каждый раз при начале новой сессии. Это также требует использования session_start() для запуска сессии перед использованием каких-либо моделей. Phalcon\Mvc\Model\MetaData\Session
Apc Этот адаптер использует кэш альтернативного PHP (APC) для хранения метаданных таблицы. Вы можете указать время жизни метаданных с помощью параметров. Это наиболее рекомендуемый способ хранения метаданных, когда приложение находится в стадии производства. Phalcon\Mvc\Model\MetaData\Apc
XCache Этот адаптер использует XCache для хранения метаданных таблицы. Вы можете указать время жизни метаданных с помощью параметров. Это наиболее рекомендуемый способ хранения метаданных, когда приложение находится в стадии производства. Phalcon\Mvc\Model\MetaData\Xcache
Файлы Этот адаптер использует обычные файлы для хранения метаданных. При использовании этого адаптера увеличивается чтение с диска, но уменьшается доступ к базе данных. Phalcon\Mvc\Model\MetaData\Files

Как и другие зависимости ORM, менеджер метаданных запрашивается из контейнера сервисов:

use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;

$di["modelsMetadata"] = function () {
    // Create a metadata manager with APC
    $metadata = new ApcMetaData(
        [
            "lifetime" => 86400,
            "prefix"   => "my-prefix",
        ]
    );

    return $metadata;
};

Стратегии метаданных

Как упоминалось выше, по умолчанию для получения метаданных модели используется интроспекция базы данных. В этой стратегии используется информация схемы, чтобы узнать поля в таблице, первичный ключ, поля с возможностью NULL, типы данных и т. д.

Вы можете изменить стандартную интроспекцию метаданных следующим образом:

use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;

$di["modelsMetadata"] = function () {
    // Instantiate a metadata adapter
    $metadata = new ApcMetaData(
        [
            "lifetime" => 86400,
            "prefix"   => "my-prefix",
        ]
    );

    // Set a custom metadata introspection strategy
    $metadata->setStrategy(
        new MyIntrospectionStrategy()
    );

    return $metadata;
};

Стратегия интроспекции базы данных

Эта стратегия не требует настройки и неявно используется всеми адаптерами метаданных.

Стратегия аннотаций

Эта стратегия использует аннотации для описания столбцов в модели:

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 поддерживает следующие параметры:

Имя Описание
type Тип столбца (строка, целое число, десятичное число, булево)
length Длина столбца, если есть
nullable Установить, принимает ли столбец значения NULL или нет

Стратегия аннотаций может быть настроена следующим образом:

use Phalcon\Mvc\Model\MetaData\Apc as ApcMetaData;
use Phalcon\Mvc\Model\MetaData\Strategy\Annotations as StrategyAnnotations;

$di["modelsMetadata"] = function () {
    // Instantiate a metadata adapter
    $metadata = new ApcMetaData(
        [
            "lifetime" => 86400,
            "prefix"   => "my-prefix",
        ]
    );

    // Set a custom metadata database introspection
    $metadata->setStrategy(
        new StrategyAnnotations()
    );

    return $metadata;
};

Метаданные вручную

Phalcon может автоматически получать метаданные для каждой модели, без необходимости разработчику устанавливать их вручную, используя любую из представленных выше стратегий интроспекции.

Разработчик также имеет возможность вручную определить метаданные. Эта стратегия переопределяет любую установленную в менеджере метаданных стратегию. Новые столбцы, добавленные/измененные/удаленные в/из сопоставленной таблицы, также должны быть добавлены/изменены/удалены для правильной работы.

Следующий пример демонстрирует, как определить метаданные вручную:

use Phalcon\Mvc\Model;
use Phalcon\Db\Column;
use Phalcon\Mvc\Model\MetaData;

class Robots extends Model
{
    public function metaData()
    {
        return array(
            // Every column in the mapped table
            MetaData::MODELS_ATTRIBUTES => [
                "id",
                "name",
                "type",
                "year",
            ],

            // Every column part of the primary key
            MetaData::MODELS_PRIMARY_KEY => [
                "id",
            ],

            // Every column that isn't part of the primary key
            MetaData::MODELS_NON_PRIMARY_KEY => [
                "name",
                "type",
                "year",
            ],

            // Every column that doesn't allows null values
            MetaData::MODELS_NOT_NULL => [
                "id",
                "name",
                "type",
            ],

            // Every column and their data types
            MetaData::MODELS_DATA_TYPES => [
                "id"   => Column::TYPE_INTEGER,
                "name" => Column::TYPE_VARCHAR,
                "type" => Column::TYPE_VARCHAR,
                "year" => Column::TYPE_INTEGER,
            ],

            // The columns that have numeric data types
            MetaData::MODELS_DATA_TYPES_NUMERIC => [
                "id"   => true,
                "year" => true,
            ],

            // The identity column, use boolean false if the model doesn't have
            // an identity column
            MetaData::MODELS_IDENTITY_COLUMN => "id",

            // How every column must be bound/casted
            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,
            ],

            // Fields that must be ignored from INSERT SQL statements
            MetaData::MODELS_AUTOMATIC_DEFAULT_INSERT => [
                "year" => true,
            ],

            // Fields that must be ignored from UPDATE SQL statements
            MetaData::MODELS_AUTOMATIC_DEFAULT_UPDATE => [
                "year" => true,
            ],

            // Default values for columns
            MetaData::MODELS_DEFAULT_VALUES => [
                "year" => "2015",
            ],

            // Fields that allow empty strings
            MetaData::MODELS_EMPTY_STRING_VALUES => [
                "name" => true,
            ],
        );
    }
}

© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/models-metadata.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API