Catalyst добавляет методы в модель DBI - PullRequest
1 голос
/ 30 января 2011

Как добавить методы в мою модель DBI, если у меня есть модель на основе 'Catalyst :: Model :: DBI', и я хочу, чтобы метод имел что-то вроде $ c-> model ('DBI') -> my_method (); но $ c-> model ('DBI') не возвращает ссылку на мой объект, скорее я получаю DBI :: db. Я могу вернуть dbh и работать над этим, но у меня есть куча служебных методов, которые я бы предпочел добавить сюда.

Ответы [ 3 ]

2 голосов
/ 30 января 2011

Я не видел ваш код, поэтому не могу точно знать, что вы делаете, но если вы используете Catalyst :: Model :: DBI , вы делаете что-то не так.Необработанная модель возвращает объект, например: MyApp::Model::DBI=HASH(0xdf7ba0)

Похоже, вы пытаетесь загрузить DBI с помощью адаптера.Подклассы DBI сложнее, чем вы думаете, поэтому я бы определенно не стал этого делать.

Минимальное воспроизведение -

# Create a new test model with SQLite.
script/*create.pl model DBI DBI "dbi:SQLite::memory:"

# A test controller to go with it.
script/*create.pl controller DBI

# Change the index method to show your raw model–
sub index :Path Args(0) {
    my ( $self, $c ) = @_;
    $c->response->body( $c->model("DBI") );
}

Теперь вы можете попробовать добавить что-нибудь в вашу модель -

# lib/MyApp/Model/DBI.pm
sub add {
    my $self = shift;
    my @add = @_;
    @add == 2 or die "2 is a terrible error message: 2";
    return $self->dbh->selectrow_array("SELECT ? + ?", {}, @add);
}

А это для вашего контроллера -

# lib/MyApp/Controller/DBI.pm
sub add : Local Args(0) {
    my ( $self, $c ) = @_;
    $c->response->body( $c->model("DBI")->add( 2,2 ) );
}

Тогда посетите localhost:3000/dbi/add.Продолжайте расширять свою модель так, как вам нравится.

Теперь, когда на вопрос дан ответ.Вы действительно, действительно, действительно должны принять учебный хит прямо сейчас и познакомиться с DBIx :: Class или с одним из других первоклассных ORM в Perl.С обнаженным DBI все в порядке, но со временем вы обнаружите 100 проблем, которые решает DBIC, и у них будет глубокий набор тестов, длинная история, десятки расширений и полезное сообщество.

0 голосов
/ 20 сентября 2011

Приведенный ниже код является примером того, как я строю свои модели, я написал учебник по этому адресу: http://brainbuz.org/techinfo. Для удобства я использую DBIx :: Simple, вы можете легко пропустить его для raw dbi и напрямую ссылаться на $ self-> dbh в вашей модели.

# Parent MODEL
package BoPeep::Model::BoPeep;

use strict;
use warnings;
use DBIx::Simple ;
use parent 'Catalyst::Model::DBI';

__PACKAGE__->config(
             dsn => BoPeep->config->{dsn} ,
             user => BoPeep->config->{user} ,
             password => BoPeep->config->{password} ,
 );

use Moose ; #use Moose immediately before calling 
            #on Moose to extend the object
has db=>(
        is =>'ro',
        isa=>'DBIx::Simple',
        lazy_build=> 1,
 # If we don't want to handle all dbis methods, 
 # specify those that we want.    
 #      handles=> [qw/query flat /],
        );
sub _build_db {
        my $self = shift ;
        return DBIx::Simple->connect($self->dbh);
} ;


# Child Model
package BoPeep::Model::BoPeep::Flock;
use Moose;
use BoPeep;
use namespace::autoclean;

extends 'BoPeep::Model::BoPeep';

sub List {
        my $self = shift ;
        my $db = $self->db ;
        my @sheep = $db->query('SELECT * FROM flock')->flat ;
        return @sheep   ;
        }
__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
1;
0 голосов
/ 11 февраля 2011

Я не использую модель прямого DBI, поэтому я не уверен, что это работает для вас.Я использую модель DBIC :: Schema

script/myapp_create.pl model DB DBIC::Schema MyApp::Schema \
    create=static dbi:mysql:mydb dbusername dbpass

Это создает модель DB в директории Model, которая является просто оболочкой для базовой схемы DBIx :: Class :: Schema, которая сохраняется в lib / MyApp /Schema.pm и lib / MyApp / Schema / Result /

Если я добавлю подпрограмму foo () в lib / MyApp / Model / DB.pm, я могу просто сослаться на нее как

$c->model('DB')->foo()

Я думал, что модель DBI также создала модель оболочки, $ c-> model ('DBI') -> dbh должна возвращать необработанный дескриптор DBI, $ c-> model ('DBI') оболочку модели катализатора

...