Как бы добавить методы к моей модели DBI, если у меня есть модель на основе Catalyst :: Model :: DBI, и я бы хотел, чтобы метод имел что-то вроде $ c-> model ('DBI') -> my_method(); но $ c-> model ('DBI') не возвращает ссылку на мой этот объект, вместо этого я возвращаю DBI :: db. Я могу вернуть dbh и работать над этим, но у меня есть куча полезных методов, которые я бы предпочел добавить сюда.Catalyst добавить методы к модели DBI
ответ
Я не видел вас код, поэтому не могу точно знать, что вы делаете, но если вы используете 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, и он поставляется с глубоким набором тестов, длинной историей, десятками расширений и полезным сообществом.
Я сам не пользуюсь прямой моделью 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') обертка модели катализатора
Код, приведенный ниже, является примером того, как я строю свои модели, я написал учебное пособие по этому вопросу: 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;
- 1. работы подключения Perl DBI, но не с Catalyst
- 2. Пример для Catalyst :: Plugin :: Authentication :: Store :: DBIC и Class :: DBI
- 3. Доступ к Apache :: DBI из DBI
- 4. Стойкие соединения с базой данных с Catalyst
- 5. ограничение Добавить к модели
- 6. добавить строку к модели
- 7. Использование автономной модели в Catalyst - Созыв общих методов
- 8. Где хранить методы, относящиеся к модели
- 9. Laravel добавить детей к модели
- 10. Rails Контроллер/Методы модели
- 11. Внутренние методы Django Модели
- 12. Catalyst + mod_cgi
- 13. Добавить дополнительные модели к модели крюк срабатывает от канальных к
- 14. Каковы наилучшие методы развертывания приложения Catalyst на производственном сервере?
- 15. Каковы наилучшие методы установки Catalyst и SQLite на Ubuntu?
- 16. методы модели в представлениях
- 17. Добавить методы экземпляра для объекта User, который использует связанные модели
- 18. Доступ к объекту Catalyst $ c из MyApp.pm
- 19. DBIC присоединяется к веб-приложению Catalyst
- 20. Методы модели Redux
- 21. Бенчмаркинг Rails Методы модели
- 22. методы модели django
- 23. Как добавить прототипные методы к угловому $ ресурсу?
- 24. Как добавить методы контекста к объекту
- 25. JS: как добавить методы к экземпляру объекта?
- 26. добавить методы на лету к объекту stdClass
- 27. Как добавить методы к прототипу объекта (JSON)?
- 28. Методы Linq добавить к хранимой процедуре add
- 29. Как добавить методы к полиморфной ассоциации рельсов?
- 30. Как добавить методы к экземпляру объекта