【发布时间】:2016-11-26 08:45:06
【问题描述】:
我正在关注从 2012 年的降临日历中收到在 Catalyst 中使用独立模型的信息:
http://www.catalystframework.org/calendar/2012/15 和前几天....
在收到此收据后,我正在从当前的胖模型转移现有代码。我想在模型中有一些通用级别的方法 - 我希望在这个示例中将它们放入lib/StandaloneApp3.pm 文件中(例如,创建订单意味着在表 order_header、表 order_item 和表日志中创建记录)并从 Controller 调用它们代码:
$c->model('DB')->create_order($params);
我收到错误:
“无法通过包定位对象方法“create_order” "WebApp::Model::DB"
当从 StandaloneApp3 命名空间调用函数时,这个工作:
&StandaloneApp3::create_order($params);
我认为这不是一个好方法,因为我的控制器应该只连接到 Catalyst 模型而不是直接连接到独立库。
在访问 StandaloneApp3.pm 中的方法或使用 DBIC::Schema 时我的代码中是否存在错误,我不希望调用此方法?如果我不应该调用 StandaloneApp3.pm 中的方法,那么在一个事务中存储可以写入更多表的方法的正确位置是什么?任何示例也用于从 Catalyst 外部精确调用这些方法 - 例如。从命令行?
感谢您的解释和示例。
----------- 添加代码 -------------
催化剂型号: 文件:lib\WebApp\Model\DB.pm:
package WebApp::Model::DB;
use strict;
use base 'Catalyst::Model::DBIC::Schema';
1;
独立模型: 文件:lib/StandaloneApp3.pm
use utf8;
package StandaloneApp3;
use Moose;
use MooseX::MarkAsMethods autoclean => 1;
extends 'DBIx::Class::Schema';
PACKAGE->load_namespaces;
sub create_order {
# in development
return "order_created";
}
PACKAGE->meta->make_immutable(inline_constructor => 0);
1;
配置: 文件:webapp.conf
<Model::DB>
schema_class StandaloneApp3
<connect_info>
dsn dbi:SQLite:__path_to(data,database_file2.db)__
</connect_info>
</Model::DB>
谢谢
【问题讨论】:
-
请附上型号的代码。特别是包含包定义和您正在调用的子文件的顶部。
-
我已将代码添加到主帖
-
看起来正确。尝试摆脱
use base并改为使用use Moose; extends 'Catalyst...'。 -
可能是我没弄好,我已经在Model DB中删除了
use base 'Catalyst::Model::DBIC::Schema';并添加了use Moose; extends 'Catalyst';,但是还是一样的错误“Can't locate object method“test” via package“ WebApp::Model::DB" -
顺便说一句,不要用
&打电话给潜艇。