完全没有文件证明这很难......
基本上,我有
package MyApp::Schema;
sub new_schema {
__PACKAGE__->connect(...)
}
然后我
package MyCatApp::Model::MyApp;
use Moose;
extends 'Catalyst::Model::DBIC::Schema';
## what here;
_PACKAGE__->make_immutable;
如何使这项工作?如果我在配置中有这个...
<Model::MyApp>
schema_class MyApp::Schema
traits Caching
user_defined_schema_accessor foo
</Model::MyApp>
我得到following error:
BEGIN失败 - 编译在MyCatapp.psgi第4行第1行中止。 加载MyCatapp.psgi时出错:无法实例化组件&#34;必须为MyCatApp :: Model :: MyApp定义 - > gt> config-&gt; {connect_info}或MyApp :: Schema必须定义连接信息在它上面。
但在sub connect_info {}
中添加MyApp::Schema
并不会改变任何内容。该错误是在line 480 of this file上生成的。
该方法似乎在查看$schema_class->storage->connect_info
,我认为它是实例化对象的方法,而不是包中的函数。但是,如果我尝试设置
__PACKAGE__->config('schema_class', MyApp::Schema->new_schema)
然后我得到......
加载时出错:无法实例化组件&#34; MyCatApp :: Model :: MyApp&#34;,&#34;属性(schema_class)不传递类型约束,因为:&#验证失败39;催化剂::型号:: DBIC ::模式::种类:: SchemaClass&#39;在/usr/local/lib/perl/5.18.2/Moose/Exception.pm第37行使用值MyApp :: Schema = HASH(0xb4a5ff0)
那么,我该如何做呢......
答案 0 :(得分:0)
所以..我不确定这是对的,所以我不会把它标记为被接受,但我非常接近..这条线已经死了......
__PACKAGE__->config('schema_class', MyApp::Schema->new_schema)
根据line 480 of Catalyst::Model::DBIC::Schema上面的链接,代码已经到位了。但是,类型错了..
type of schema_class is SchemaClass
。并且,SchemaClass is defined here
subtype SchemaClass,
as LoadableClass,
where { $_->isa('DBIx::Class::Schema') };
现在,SchemaClass
是MooseX::Types::LoadableClass
的子类型,基本上只需要一个包名并需要它。
问题是LoadableClass没有采用DBIC :: Schema的实例。无论如何..我刚刚改变了它..
has schema_class => (
is => 'ro',
isa => 'Object',
required => 1
);
现在我可以将一个实例化的模式填充到schema_class中并传递条件if($schema_class->storage && $schema_class->storage->connect_info)
。
我提交了bug on this here
答案 1 :(得分:0)
您可以在MyApp::Schema
中实例化连接信息:
__PACKAGE__->connection(@your_connection_details);
这将在类本身上设置存储,而不是架构对象。然后,这将通过Catalyst::Model::DBIC::Schema
检查并成功运行。我认为这可以在不改变基础类的情况下实现您所追求的目标(尽管可能取决于未包含的细节)。
答案 2 :(得分:-1)
在您referenced的文档中,您的MyCatApp::Model::MyApp
将如下所示:
__PACKAGE__->config(
schema_class => 'MyApp::Schema',
connect_info => {
dsn => 'dbi:Pg:dbname=mypgdb',
user => 'postgres',
password => '',
pg_enable_utf8 => 1,
on_connect_do => [
'some SQL statement',
'another SQL statement',
],
}
);
在你的控制器中,你会:
my $db = $c->model('MyApp');