Catalyst::Model::DBIC::Schema

Catalyst::Model::DBIC::Schema - DBIx::Class::Schema Model Class

Сначала нужно подготовить вашу базу данных с помощью DBIx::Class. 
Catalyst.
Дополнительная информация по модулям: Catalyst::Helper::Model::DBIC::Schema - с помощью него, создается DBIx::Class::Schema из вашей БД, используя Helper скрипт и DBIx::Class::Schema::Loader::Base
script/myapp_create.pl model FilmDB DBIC::Schema MyApp::Schema::FilmDB \
    create=static dbi:mysql:filmdb dbusername dbpass \
    quote_names=1
Это пример подразумевает, что вы уже имеете БД FilmDB, который создаст Result classы для таблиц  MyApp::Schema::FilmDB::Result::Actor
Хелпер так же создаст lib/MyApp/Model/FilmDB.pm файл.
Или можно создать так:

script/myapp_create.pl model FilmDB DBIC::Schema MyApp::Schema::FilmDB
    dbi:mysql:filmdb dbusername dbpass
Информацию о подключении к БД "connect_info", можно опционально прописать в самом модуле, но лучше вынести ее отдельно в конфигурационный файл, который обладает большим приоритетом.

Теперь мы имеем работающую модель БД, к которой можно получить доступ с помощью обычного Catalyst метода: $c->model();
my $db_model = $c->model('FilmDB'); # модель Catalyst
my $dbic = $c->model('FilmDB')->schema; # DBIC объект

Можно и напрямую заполучить DBIx::Class::ResultSet вместо Catalyst::Model, так:
my $rs = $c->model('FilmDB::Actor');

В lib/MyApp/Schema/FilmDB/ResultSet/Actor.pm вы можете реализовать свои методы, дабы скрыть логику бд.

$c->model('Film::Actor')->SAG_members;

Модель - это не сама бд или таблица, а прослойка с методами к ним.

Три способа получить DBIC resulset объект.
my $rs = $c->model('FilmDB')->schema->resultset('Actor');
my $rs = $c->model('FilmDB')->resultset('Actor');
my $rs = $c->model('FilmDB::Actor');

Параметры конфига


schema_class
Имя класса вашей DBIx::Class::Schema схемы. Нужен, чтобы найти его в @INC. И не нужен в Catalyst::Model::namespace. Этот параметр необходим.

connect_info
Определяет storage_type. Не требуется если информация о подключение есть внутри schema_class (что крайне не желательно). Основные параметры для storage_type(DBIx::Class::Storage::DBI):
dsn, username, password и ссылка на хэш с оциями подключения.
<Model::FilmDB>
    schema_class   MyApp::Schema::FilmDB
    traits Caching
    <connect_info>
        dsn   dbi:Pg:dbname=mypgdb
        user   postgres
        password ""
        auto_savepoint 1
        quote_names 1
        on_connect_do   some SQL statement
        on_connect_do   another SQL statement
    </connect_info>
    user_defined_schema_accessor foo
</Model::FilmDB>

traits
Traits - это Moose::Role. Массив traits применяется к экземпляру.
Они вначале относятся к MyApp::TraitFor::Model::DBIC::Schema::, затем к
Catalyst::TraitFor::Model::DBIC::Schema:: namespace, если "+"не указано полное имя класса.
traits Caching
traits +MyApp::TraitFor::Model::Foo

Новый экземпляр созданный приложением при запуске, поэтому запрашивает необходимые аттрибуты, приведение типов данных и модификаторы, которые будут работать после.

Traits применяются к "COMPONENT" в Catalyst::Component всякий раз, используя CatalystX::Component::Traits

ref $self станет тотчас классом если будут применены какие нибудь traits,
$self->_original_class_name станет оригинальным классом.

Когда пишете Trait то интересные точки для модификации это: BUILD, "setup" и "ACCEPT_CONTEXT"

Доступные в дистрибутиве: Catalyst::TraitFor::Model::DBIC::Schema::Caching, Replicated, SchemaProxy, PerRequestSchema


storage_type
Позволяет использовать различные типы storage_type, которые установлены в вашей schema_class (если не установлен DBIx::Class, то обычно это ::DBI). Так как большинство поддерживает DBIx::Class, то использование этого аргумента не необходимо.

Аттрибуты


connect_info
Информация в виде хэша (с dsn/user/password)

model_name
Имя модели, если ваш класс называется MyApp::Model::DB то "model_name" будет DB.

_default_cursor_class
Чтобы сбросить ваш "cursor_class" по умолчанию. Этот класс DBIx::Storage::DBI::Cursor.


Аттрибуты из MooseX::Traits::Pluggable

_original_class_name
Имя класса до того как "traits" будут применены. Например MyApp::Model::DB

_traits
Неразрешенный массив ссылок trait расположенные в конфиге.

_resolved_traits
Разрешенные traits которые вы используете к полным названиям класса.


Настройка вашей Schema и Resultsets


Методы

new
Экземпляры модели созданные на основе вышеупомянутых -config параметров. Необходимый параметр только schema_class, и connect_info если в schema_class нет этой информации.

schema
Возвращает schema к которой подключена эта модель. Есть прямые сслыки на schema->resultset, schema->source и schema->class

composed_schema
Аксессор, который возвращает составную схему, которая не имеет информации для подсоединения к ней, которая была используема в создании schema выше. Полезно, для создания нового соединения основанного на той же самой schema/model. Есть прямые ссылки из объекта модели для composed_schema->clone и composed_schema->connect

clone
Сокр для ->composed_schema->clone

connect
Сокр для ->composed_schema->connect

source
Сокр для ->schema->source

class
Сокр для ->schema->class

resultset
Сокр для ->schema->resultset

txn_do
Сокр для ->schema->txn_do

txn_scope_guard
Сокр для ->schema->txn_scope_guard

storage
Предоставляет доступ к подсоединенному объекту schema storage

setup
Вызывается во время сборки BUILD до конфигурации, но после установки "connect_info". Чтобы сделать что то после конфигурации используйте
after BUILD =>.
Получите хеш ссылок на аргументы для BUILD.

Окружение


CMDS_NO_SOURCES
Установите эту переменную. если вы будите использовать схемы без Resul classов чтобы выключить предупреждения, которые обычно выбрасываются, если нет Resul class.

Установка DBIC аутентификации, проверки подлинности

Для доп.информации смотрите Catalyst::Authentication::Store::DBIx::Class в MyApp.pm

package MyApp;
use Catalyst qw/... Authentication .../;
...
__PACKAGE__->config('Plugin::Authentication' =>
              {
                  default_realm => 'members',
                  members => {
                      credential => {
                          class => 'Password',
                          password_field => 'password',
                          password_type => 'hashed'
                          password_hash_type => 'SHA-256'
                      },
                      store => {
                          class => 'DBIx::Class',
                          user_model => 'DB::User',
                          role_relation => 'roles',
                          role_field => 'rolename',
                      }
                  }
              });