2011-01-30 2 views
1

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

ответ

1

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

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

Минимальная reproduction-

# 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")); 
} 

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

# 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. Bare Bones DBI отлично, но со временем вы столкнетесь со 100 проблемами, которые решал DBIC, и он поставляется с глубоким набором тестов, длинной историей, десятками расширений и полезным сообществом.

0

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

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

Это создает модель DB в модели директории, которая является лишь оболочкой для базового DBIx :: схемы Class :: схемы, которая сохраняется в Lib/MyApp/Schema. вечера и Lib/MyApp/Schema/Результат/

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

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

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

0

Код, приведенный ниже, является примером того, как я строю свои модели, я написал учебное пособие по этому вопросу: http://brainbuz.org/techinfo. Я использую DBIx :: Simple в качестве удобства, вы можете легко пропустить его для необработанных 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; 
Смежные вопросы