Perl 如何从DBIC::Schema创建Catalyst::Model::DBIC::Schema?

Perl 如何从DBIC::Schema创建Catalyst::Model::DBIC::Schema?,perl,catalyst,dbix-class,Perl,Catalyst,Dbix Class,完全缺乏文档使得这一点很困难 基本上,我有 package MyApp::Schema; sub new_schema { __PACKAGE__->connect(...) } 那我有 package MyCatApp::Model::MyApp; use Moose; extends 'Catalyst::Model::DBIC::Schema'; ## what here; _PACKAGE__->make_immutable; 我该怎么做?如果我的配置中有这个

完全缺乏文档使得这一点很困难

基本上,我有

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>
然后我得到

加载时出错:无法实例化组件“MyCatApp::Model::MyApp”,“属性(schema_类)未通过类型约束,因为:在/usr/local/lib/perl/5.18.2/Moose/Exception.pm第37行对值为MyApp::schema::Types::SchemaClass的“Catalyst::Model::DBIC::schema::Types::SchemaClass”的验证失败


那么,我该怎么做呢…

所以..我不确定这是否正确,所以我不会将其标记为已接受,但我已经非常接近..这条线已经死了

__PACKAGE__->config('schema_class', MyApp::Schema->new_schema)
根据上面的链接,代码已经准备好了,但是类型是错误的

以及

现在,
SchemaClass
是a的一个子类型,它本质上只需要一个包名并需要它

问题是LoadableClass没有采用DBIC::Schema的实例。无论如何..我也只是改变了它

has schema_class => (
    is => 'ro',
    isa => 'Object',
    required => 1
);
现在我可以将一个实例化的模式填充到schema_类中,并传递条件
if($schema_类->存储&$schema_类->存储->连接信息)


我从文档中提交了一个

,您的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');

您可以通过执行以下操作在您的
MyApp::Schema
中实例化连接信息:

\uuuuuu包\uuuuuu->connection(@your\u connection\u details);


这将在类本身而不是架构对象上设置存储。然后,这将通过
Catalyst::Model::DBIC::schema
检查并成功运行。我认为这在不更改基础类的情况下实现了您想要的功能(尽管可能取决于未包含的详细信息).

模型不需要实例化的dbic架构实例。它需要类和connect\u信息来实例化它自己,这是我所见过的所有操作。将架构对象作为参数传递给schema\u类似乎不合适。您的connect\u信息子项没有返回任何连接信息。它想知道如何连接以获取连接的架构对象。连接信息子对象根本没有被调用。好的,链接的代码被称为
$schema\u class->storage->connect\u info
。如果$schema\u class实际上已经是架构对象(如果您已经连接),那么您只有一个
$schema\u class->storage
。不,不会的。这只是一个例子。我的模式有非常复杂的连接逻辑,它可以连接自己。我想让模式处理连接和逻辑,很明显,因为引用的代码支持这样做……而且,由于错误消息支持,功能应该存在,或者MyApp::Schema必须有连接信息定义在它上面。啊,那就好了。我们也有复杂的连接逻辑,但在一天结束时,它总是一个dsn、用户传递和选项。该逻辑被封装,模式和模型适配器类都使用它。在模型中,一个
围绕BUILDARGS
修饰符被用来调用复杂的逻辑来获得dsn用户传递和调整ust连接信息和模型被愉快地实例化。很高兴你的工作也正常。干杯。好吧,我的工作是通过黑客
C:M:DBIC:S
。但是,好吧,那就是目的。除非有人能向我解释L480上的代码应该如何工作,否则我认为这是一个bug。
has schema_class => (
    is => 'ro',
    isa => 'Object',
    required => 1
);
__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',
    ],
  }
);