7

我正在使用Catalyst 框架编写一个 Web 应用程序。我还使用了一个名为TheSchwartz的作业队列。

我想要使​​用作业队列,因为我想要尽可能多的应用程序特定代码与 Web 应用程序接口代码分离。

基本上整个系统由三个主要部分组成:

  • GUI(催化剂网络界面)
  • 一个爬虫
  • 一个“攻击组件”(正在编写该应用程序以查找其他 Web 应用程序/站点中的 XSS 和 SQLi 漏洞)

所以理论上 GUI 为爬虫创建作业,而爬虫又为“攻击组件”创建作业。

目前我在 Catalyst 中有一个模型,它实例化了一个 TheSchwartz 对象,以便网络应用程序中的控制器可以将作业添加到作业队列中。

我还需要创建一些作业工作者脚本来持续侦听(/检查数据库)新作业,以便他们可以执行所需的操作。目前,TheSchwartz 的数据库特定内容位于 Catalyst 的模型中,我认为我无法在 Catalyst 之外轻松访问它?

我不想在模型中复制 TheSchwartz 作业队列的数据库连接数据,然后在我的作业工作者脚本中复制。我是否应该将 TheSchwartz 对象的创建包装在 Catalyst 之外的另一个类中,并在当前实例化 TheSchwartz 对象的模型中调用它?然后我也可以在工作脚本中使用它。或者我应该将数据库数据放在配置文件中,并在需要时实例化新的 TheSchwartz 对象(在 Catalyst 中/在作业工作者脚本中)?

还是我只是在想这个?

一些指向丰富的网络应用程序架构文章的链接也可能有用(我以前从未构建过中等复杂性的文章......)。

干杯

4

3 回答 3

4

你在使用 DBIx::Class 吗?即使您不是,这里的基本思想也适用,但我将继续假设您是。

Catalyst 模型应该是另一个类的包装器,只提供与 Catalyst 接口的足够行为,仅此而已。例如 Catalyst::Model::DBIC::Schema 只是 DBIx::Class::Schema 的包装器。它从 Catalyst 获取配置并将其传递给 DBIC,将 ResultSets 注入 Model 命名空间(这样您就可以做到这一点$c->model('DB::Table')),然后它就离开了。

优势在于,由于所有重要代码都位于 Catalyst::Model 之外,因此它完全独立于 Catalyst。您可以从维护脚本或作业队列工作者或其他任何东西加载您的模式,传递一些配置,告诉它连接并开始,而无需调用 Catalyst。ResultSet 中的所有信息和逻辑以及在 Catalyst 外部和内部同样可用的任何其他信息。

于 2009-10-26T02:20:17.203 回答
3

如果我理解正确,您的问题是“如何在 Catalyst 之外重用我的数据库连接?”。

您应该在 Catalyst 应用程序中使用 DBIx::Class。您可以在任何其他应用程序中重复使用相同的文件。$c->mode('DB::MyTable')->search(...)在 Catalyst 中与在 Catalyst 之外的情况相同:

my $schema = MyApp::Model::DB->new();
$schema->resultset('MyTable')->search(...)

任何模型都可以像常规包 MyApp::Model::Library->new() 一样在 Catalyst 之外调用。您只想确保不使用 $c 作为参数。

于 2009-10-26T02:23:36.360 回答
3

您应该看看的一件事是使用TheSchwartz::Simple来创建工作,而不是使用 TheSchwartz 本身(您实际上只需要它来处理工作)。优点是:

  • 轻量级(无需将整个 TheSchwartz 加载到您的 Catalyst 应用程序中)
  • 接受一个简单的数据库句柄来连接数据库,而 TheSchwartz 本质上有它自己的数据库包装层,并希望你给它用户名和密码并管理它自己的连接(你说过你不希望它这样做)
于 2009-10-27T11:14:02.433 回答