对于我目前正在编写的应用程序,我需要创建链接。链接由文章名称和类别名称组成,必须在我想要使用链接的所有地方都这样做。重复该代码对我来说很难维护并且容易出错。因此,我希望此链接/url 是表/类中的虚拟列。
我确实找到了一个可以添加虚拟列的模块,但文档指出这只是一个“概念验证”,已有 10 多年历史,并且存在未解决的问题。DBIx ::Class::VirtualColumns
还发现了一种使用自定义方法扩展结果集的方法: 预定义搜索和创建结果集类
两者都使用预定义搜索的方法。
因此我创建了一个结果集目录和以下模块
package MySite::Schema::ResultSet::Article;
use strict;
use warnings;
use Data::Dumper;
use base 'DBIx::Class::ResultSet';
sub returnURL {
my ($self, $which) = @_;
my $blaat =$self->find(
{article_id => $which}
);
my $result = $blaat->slug;
print "\n>>$result<<\n";
return $result;
}
1;
出于调试目的调用此方法(在 Dancer2 应用程序中):
debug schema.resultset('Article')->returnURL(2);
输出结果如下
>>artikel_2<<
[MySite:94935] debug @2024-11-25 10:08:13> MySite::Schema=HASH(0x6216cb9aae60)artikel_2 in /var/www/MySite/bin/../lib/MySite.pm l. 24
第一行正是我所期望的。第二行中的“MySite::Schema=HASH(0x6216cb9aae60)”不是。这是从哪里来的?
此外:我在 TT 模板中循环文章并尝试获取方法的结果:
<% url1 = schema.resultset('Article').returnURL(1) %>
<% url2 = article.returnURL(1) %>
>><% url1 %><<
>><% url2 %><<
(是的,文章索引现在是硬编码的)url1 和 url2 都返回空。
我很确定我正在做一些非常研究的事情,只是不知道是什么。
按照 Dave 的建议尝试过(我认为)
将该方法移至 wat 为我创建的类中:
sub returnURL {
print ">>blaat<<";
my ($self, $which) = shift;
# my $blaat =$self->find(
# {article_id => $which}
# );
# my $result = $blaat->slug;
# print "\n>>$result<<\n";
# return $result;
return("hey there ".$self->slug);
}
在 Perl 代码中调用该方法会返回错误。
Can't locate object method "returnURL" via package "DBIx::Class::ResultSet" at /var/www/MySite/bin/../lib/MySite.pm line 24.
所以我想,谁在乎呢……无论如何模板中都需要它。然后注释掉了它。之后我在模板中使用的第二种方法确实返回了一个结果:
<% article.returnURL() %>
给了我
hey there artikel_4
这正是我所期望的,也是我可以使用的东西。结果我甚至不需要提供文章索引。
谢谢你戴夫