0

モデル lib/MyApp/Model/Foo.pm を作成しました。その中:

...
sub bar {
  my $schema = MyApp::Schem->connect("dbi:SQLite:data.db");
}
...

それはうまくいきますが、私がそう書くとき:

...
my $schema = MyApp::Schema->connect("dbi:SQLite:data.db");
sub bar {}
...

それは機能せず、これを書きます:

パッケージ "MyApp::Schema" を介してオブジェクト メソッド "connect" が見つかりません (おそらく "MyApp::Schema" をロードするのを忘れていませんか?) ...

グローバルな $schema var を作成して、さまざまなメソッドで使用したいと考えています。どうすれば到達できますか?

4

3 に答える 3

2

Catalyst :: Model :: DBIC :: Schemaは、開始される可能性のあるすべてのプロセスについて、データベースへの接続を自動的に処理します。

概要に示されているようにヘルパーを使用してMyApp::Model :: DBICを作成すると、すぐに使用できます。SQLiteの場合のデータベースクレデンシャルまたはデータベースファイル名は、通常、Catalyst :: Plugin::ConfigLoaderによってロードされるCatalyst構成ファイル内に配置されます。

通常、CatalystモデルにもDBIx::Classスキーマにもメソッドを追加しないことに注意してください。

モデルにアクセスするには、そのタイプ(DBIC、LDAPなど)に関係なく、$c->model($modelname)Catalystで使用する必要があります。したがって、モデルにMyApp :: Model :: DBICという名前を付けた場合、これはになります$c->model('DBIC')。DBIC結果セットにアクセスするには、 Catalyst :: Model :: DBIC::Schemaがサポートする特別な構文$c->model('DBIC')->resultset('Foo')またはを使用できます。$c->model('DBIC::Foo')

于 2013-03-21T16:57:52.277 に答える
0

ロードするのを忘れましたMyApp::Schemaか?

MyApp::Schema->connectサブルーチン内を呼び出すと、他のCatalystコンポーネントがすでにMyApp::Schemaモジュールをロードし、connectメソッドを使用可能にしている可能性があります。

サブルーチンの外部では、アプリケーションはモジュールMyApp::Schema::connectのロード時に呼び出しを試みます。MyApp::Model::Fooモジュールが成功するかどうかは、他のパッケージがロードされる順序によって異なります。したがってuse MyApp::Schema;、パッケージの先頭に書き込むと、MyApp::Model::Foo問題が解決する可能性があります。


問題を解決する可能性のあるもう1つのことは、スキーマの遅延初期化です。$schemaモデル内のすべてのインスタンスを関数呼び出し、たとえば、に置き換え、次のschema()コードを含めます。

my $_schema;
sub schema {
    $_schema //= MyApp::Schem->connect("dbi:SQLite:data.db")
}

これで、スキーマオブジェクトは必要なときに一度初期化され、おそらくアプリケーションが依存する他のすべての関連モジュールがロードされた後に初期化されます。

于 2013-03-21T15:33:55.107 に答える
0

Catalyst::Model::DBIC::Schemaを読んで、$self->schema を使用してどこからでも db スキーマにアクセスできることを確認しました。したがって、このバリアントは正常に機能します。

sub bar {
  my ($self) = @_;
  my $schema = $self->schema;
}
于 2013-03-21T16:40:44.297 に答える