/ / Comment redéfinir la méthode "new" dans DBIx :: Class Tables - perl, dbix-class

Comment remplacer la nouvelle méthode dans DBIx :: Class Tables - perl, dbix-class

J'ai lu ici http://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_row qu'un moyen de définir les valeurs par défaut des colonnes consistait à remplacer le Nouveau méthode.

Mon problème est que ma nouvelle méthode n'est jamais appelée.

User.pm

package MyApp::SchemaTest::Result::User;
use strict;
use warnings;
use base qw/DBIx::Class::Core/;

sub new {
die "new: @_";
}
__PACKAGE__->table("GECKO_USER");
__PACKAGE__->add_columns(
"user_id",
{ data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
"first_name",
{ data_type => "varchar2", is_nullable => 0, size => 45 },
"last_name",
{ data_type => "varchar2", is_nullable => 0, size => 45 } );
__PACKAGE__->set_primary_key("user_id");

1;

test.pl

use Gecko2::SchemaTest;

my $schema = Gecko2::SchemaTest->connect("dbi:SQLite:$FindBin::Bin/../db/gecko2.sqlite");
ok($schema, "got schema");

my $user = $schema->resultset("User")->find( { login => "toto" });
use DDP;
p $user;

Et je reçois l'objet $ user entièrement construit et opérationnel, ce qui signifie que ma nouvelle méthode n'est jamais appelée. Pourquoi pas ???

J'ai essayé de le déplacer mais sans succès ...

Réponses:

2 pour la réponse № 1

Si vous appelez trouver un objet Result / Row est construit à partir des valeurs de la base de données. Le cas décrit dans le livre de recettes sert à créer de nouveaux objets de ligne, par exemple. en appelant $ rs-> create.

Pourquoi voudriez-vous remplacer les valeurs provenant de la base de données?

Notez que vous pouvez également définir une valeur par défaut pour unecolonne avec l'attribut "default_value". Cela ne définira pas la valeur de la colonne si vous construisez un objet de ligne avec new_result mais définissez la valeur de colonne par défaut de la base de données si vous déployez votre base de données avec $ schema-> deploy.

Si vous souhaitez définir la valeur d'un nouvel objet de ligne, consultez DBIx :: Class :: DynamicDefault.


0 pour la réponse № 2

J'ai finalement trouvé la solution: pour contrôler l’instanciation des objets de la base de données / stockage, vous devez remplacer le inflate_default méthode.

De la doc:

Toutes les méthodes DBIx :: Class :: ResultSet qui extraient des données du base de données et le transformer en objets de ligne appellent cette méthode (* inflate_default *).

Étendez cette méthode dans vos classes de résultats pour vous connecter à ce processus, par exemple, rééditer le résultat dans une classe différente.

Bien sûr, si vous devez contrôler l'instanciation d'objets de ligne par la nouvelle méthode, vous devez la remplacer.

Pour résumer, si vous souhaitez vous connecter à toutes les instanciations possibles des objets de ligne, vous devez remplacer les deux. inflate_result et Nouveau.