【问题标题】:Where do I put my snaplets?我应该把我的 snaplets 放在哪里?
【发布时间】:2014-07-29 23:14:25
【问题描述】:

我是 Haskell 和 Snap 的新手,我想编写一个简单的错误跟踪应用程序。我使用$ snap init 设置了一个 Snap 项目,它可以工作。问题是我不知道该怎么走。

我想创建一个使用数据库存储错误报告的 snaplet Tickets,并在我的主 Web 应用程序中使用该 snaplet。

我阅读了有关 snaplets 的文档,但我不知道将它们的源代码放在哪里(我想是在 /snaplets 目录中?如果是,我该如何加载它们?)。有人能指出我正确的方向吗?

【问题讨论】:

    标签: haskell haskell-snap-framework


    【解决方案1】:

    您确定需要为工单创建单独的 snaplet 吗? snaplet 基础设施适用于可重用组件,例如会话管理、身份验证、数据库访问、管理面板、用户管理等。

    您是否要在多个 Web 应用程序中使用您的门票自包含模块?如果是这样,那么一定要继续创建一个 snaplet。

    无论如何,在我看来,您至少部分是在询问如何在使用 snap 时组织具有多个“模块”或“部分”的项目。我将尝试在下面解决这个问题。如果您觉得我没有达到目标,请告诉我。

    假设您不需要为工单创建单独的 snaplet:

    对于特定于单个站点的功能,我认为您最好创建一些模块并在当前应用程序的包和模块层次结构中为该功能开发代码。以下是关于我最近如何组织我的快照项目的几点:

    • 我把我的数据库相关代码放在MyApp.DB.的模块下 命名空间。你可以有一个 MyApp.DB.Tickets 包含所有 对门票模块进行操作所需的数据库调用。

    • 我将所有与 UI 相关的功能放在 MyApp.UI. 命名空间下。你 可以放置一个包含您的HandlersMyApp.UI.Tickets 模块, 你的Splices,你的Forms等等。

    • 为了处理表单,我使用了出色的 digestive-functors 库。如果您还不了解blog post,您可能会发现它们很有帮助。

    • 我通常在MyApp.UI.Helpers 下有一个共享的 UI 帮助程序库,我在其中放置所有/大多数 UI 模块使用的通用代码。

    • 我通常在MyApp.UI.Forms下有一个共享的Form helper库

    • 任何与我的应用程序公开 Web UI 这一事实相切的代码都超出了MyApp.UI. 命名空间。因此,如果我的应用程序需要执行一些离线分析,我可以将它们放在MyApp.Analysis. 命名空间下。

    MyApp.UI.Tickets 下定义和导出处理程序后,您可以转到Site.hs 文件并将它们连接到您的应用程序中的特定路径。

    有关如何处理数据库连接的灵感,您可以查看postgresql-simple snaplet

    但是,如果您确实需要创建 snaplet:

    snaplet 只是一个使用 Snap.Snaplet 基础架构的独立应用程序,(通常)有自己的 .cabal 文件,并且(通常)是自己的 Haskell 包。然后,Snap 为您提供了一种将这个可重用、独立的应用程序嵌入嵌套到另一个 snap 应用程序中的方法。想想Russian dolls 的层次结构。

    假设您执行的操作与我在上一节中描述的类似,您现在 95% 已准备好转换为 snaplet。只需将您的应用程序命名为 snaplet-tickets,使用 makeSnaplet 公开 SnapletInit 并在另一个 snap 应用程序中使用 nestSnaplet 以在此处包含这个可重用的功能。

    【讨论】:

    • 所以如果我想创建一个 snaplet,我会创建一个新的应用程序 snaplet-tickets 并使用makeSnaplet 公开它。我将如何在我的主应用程序中使用它?我是否使用 cabal 安装它,然后 import 它?
    • 是的,如果你真的有一个可重用的组件想要制作成一个 snaplet,那么我会把它放在它自己的项目中。我的 snaplets snaplet-postgresql-simple(还没有被破解)和snaplet-acid-state 是如何做到这一点的例子。
    猜你喜欢
    • 2020-09-30
    • 2019-07-11
    • 2016-08-25
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多