2015-08-18 1 views
0

manque total de documentation rend ce difficile ..Comment créer un schéma Catalyst :: Model :: DBIC :: à partir d'un schéma DBIC ::?

Essentiellement, je

package MyApp::Schema; 
sub new_schema { 
    __PACKAGE__->connect(...) 
} 

J'ai

package MyCatApp::Model::MyApp; 
use Moose; 
extends 'Catalyst::Model::DBIC::Schema'; 

## what here; 

_PACKAGE__->make_immutable; 

Comment puis-je faire ce travail? Si j'ai dans ma config ...

<Model::MyApp> 
     schema_class MyApp::Schema 
     traits Caching 
     user_defined_schema_accessor foo 
</Model::MyApp> 

-je obtenir le following error:

BEGIN échoué - compilation avortée à la ligne de MyCatapp.psgi 4, ligne 1. Erreur lors du chargement MyCatapp. psgi: Impossible d'instancier le composant « soit -> config -> {} connect_info doit être défini pour MyCatApp :: Model :: MyApp ou MyApp :: schéma doit avoir défini les informations relient sur elle

Mais en ajoutant sub connect_info {}. au MyApp::Schema ne change rien. Cette erreur est générée sur line 480 of this file.

Cette méthode semble regarder $schema_class->storage->connect_info qui je crois est une méthode sur un objet instancié, et non une fonction dans le paquet. Cependant, si je tente de mettre

__PACKAGE__->config('schema_class', MyApp::Schema->new_schema) 

je puis obtenir ...

Erreur lors du chargement: Impossible d'instancier le composant "MyCatApp :: Model :: MyApp", « Attribute (schema_class) ne passe pas la contrainte de type car: La validation a échoué pour 'Catalyst :: Model :: DB :: :: Types :: SchemaClass' avec la valeur MyApp :: Schema = HASH (0xb4a5ff0) dans/usr/local/lib/perl/5.18.2/ligne Moose/Exception.pm 37

Alors, comment dois-je m'y prendre ...

Répondre

0

donc .. Je ne suis pas sûr que ce soit à droite, je ne marque pas donc comme accepté mais j'étais sacrément près .. Cette ligne est mort sur ..

__PACKAGE__->config('schema_class', MyApp::Schema->new_schema) 

Et le code est en place pour que cela fonctionne, selon le lien ci-dessus sur line 480 of Catalyst::Model::DBIC::Schema. Cependant, le type est erroné.

Le type of schema_class is SchemaClass. Et, SchemaClass is defined here

subtype SchemaClass, 
    as LoadableClass, 
    where { $_->isa('DBIx::Class::Schema') }; 

Maintenant, SchemaClass est un sous-type d'un MooseX::Types::LoadableClass qui prend essentiellement juste un nom de paquet et exige ..

Le problème est LoadableClass ne prend pas une instance de DBIC :: schéma . Quoi qu'il en soit .. je viens de changer trop ..

has schema_class => (
    is => 'ro', 
    isa => 'Object', 
    required => 1 
); 

Maintenant je peux farcir un schéma instancié dans schema_class et passer le if($schema_class->storage && $schema_class->storage->connect_info) conditionnel.

I a déposé une bug on this here

+0

Le modèle ne souhaite pas l'instance de schéma dbic instancié. Il veut la classe et le connect_info afin de l'instancier lui-même, ce que j'ai toujours vu. passer un objet schéma en tant que paramètre à schema_class ne semble pas correct. votre sous-connexion connect_info n'a renvoyé aucune information de connexion. Il veut savoir comment se connecter pour obtenir un objet de schéma connecté. – mikew

+0

le sous-dossier connect_info n'est pas appelé du tout. Afaik, le code, comme lié, est appelé '$ schema_class-> storage-> connect_info'. Vous n'avez qu'un '$ schema_class-> storage' si $ schema_class, est déjà un objet schéma (si vous êtes déjà connecté). –

-1

De la documentation que vous referenced, votre MyCatApp::Model::MyApp ressemblerait à ceci:

__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', 
    ], 
    } 
); 

Et dans votre contrôleur, vous devez:

my $db = $c->model('MyApp');

+0

Non, ce n'est pas un exemple. Mon schéma a une logique de connexion très complexe, et il peut se connecter. Je veux laisser le schéma gérer la connexion et la logique et clairement, comme le code référencé supporte il y a une logique pour le faire ... Et, comme le message d'erreur supporte la fonctionnalité devrait être là * ou MyApp :: Schema doit avoir des informations de connexion défini dessus. * –

+0

Ahh bonne affaire alors. Nous avons aussi une logique de connexion compliquée mais à la fin de la journée, c'est toujours un dsn, un user pass et des options. Cette logique est encapsulée et la classe d'adaptateur de schéma et de modèle l'utilise. Dans le modèle, un modificateur «BUILDARGS» est utilisé pour appeler la logique compliquée afin de faire passer l'utilisateur DSN et ajuster l'information de connexion et le modèle est heureusement instancié. Je suis content que vous ayez le vôtre aussi. À votre santé. – mikew

+0

Eh bien, j'ai eu le mien de travail en piratant 'C: M: DBIC: S'. Mais, afaik, c'était cette intention. À moins que quelqu'un puisse m'expliquer comment le code sur L480 devait fonctionner, je pense que c'est un bug. –

0

Vous pourrait instancier les informations de connexion dans votre MyApp::Schema par le faire ING:

__PACKAGE__->connection(@your_connection_details);

Cela crée un stockage sur la classe elle-même, et non pas un objet de schéma. Cela passera ensuite la vérification Catalyst::Model::DBIC::Schema et fonctionnera avec succès. Je pense que cela réalise ce que vous voulez sans changer les classes sous-jacentes (bien que cela puisse dépendre des détails non inclus).