我是 Haskell 和 Snap 的新手,我想编写一个简单的错误跟踪应用程序。我使用它设置了一个 Snap 项目$ snap init
,它可以工作。问题是我不知道如何走得更远。
我想创建一个Tickets
使用数据库存储错误报告的 snaplet,并在我的主 Web 应用程序中使用该 snaplet。
我阅读了有关 snaplets 的文档,但我不知道将它们的源代码放在哪里(/snaplets
我想在目录中?如果是,我如何加载它们?)。有人能指出我正确的方向吗?
我是 Haskell 和 Snap 的新手,我想编写一个简单的错误跟踪应用程序。我使用它设置了一个 Snap 项目$ snap init
,它可以工作。问题是我不知道如何走得更远。
我想创建一个Tickets
使用数据库存储错误报告的 snaplet,并在我的主 Web 应用程序中使用该 snaplet。
我阅读了有关 snaplets 的文档,但我不知道将它们的源代码放在哪里(/snaplets
我想在目录中?如果是,我如何加载它们?)。有人能指出我正确的方向吗?
您确定需要为工单创建单独的 snaplet 吗?snaplet 基础设施适用于可重用组件,例如会话管理、身份验证、数据库访问、管理面板、用户管理等。
您是否要在多个 Web 应用程序中使用您的门票自包含模块?如果是这样,那么一定要继续创建一个 snaplet。
无论如何,在我看来,您至少部分是在询问如何在使用 snap 时组织具有多个“模块”或“部分”的项目。我将尝试在下面解决这个问题。如果您觉得我错过了分数,请告诉我。
假设您不需要为工单创建单独的 snaplet:
对于特定于单个站点的功能,我认为您最好创建一些模块并在当前应用程序的包和模块层次结构中为功能开发代码。以下是关于我最近如何组织我的快照项目的几点:
我将与数据库相关的代码放在MyApp.DB.
命名空间中的模块下。您可以拥有一个MyApp.DB.Tickets
包含在门票模块上进行操作所需的所有数据库调用。
我将所有与 UI 相关的功能放在MyApp.UI.
命名空间下。您可以放置一个MyApp.UI.Tickets
包含 your Handlers
、 your Splices
、 yourForms
等的模块。
为了处理表格,我使用了优秀的消化函子库。如果您还不知道这篇博文,您可能会发现它们很有帮助。
我通常有一个共享的 UI 帮助程序库,在MyApp.UI.Helpers
其中放置所有/大多数 UI 模块使用的通用代码。
我通常在下面有一个共享的表单助手库MyApp.UI.Forms
任何与我的应用程序公开 Web UI 的事实相切的代码都超出了MyApp.UI.
命名空间。因此,如果我的应用程序需要执行一些离线分析,我可以将它们放在MyApp.Analysis.
命名空间下。
一旦您在 下定义并导出处理程序MyApp.UI.Tickets
,您就可以转到您的Site.hs
文件并将它们连接到您的应用程序中的特定路径。
有关如何处理数据库连接的灵感,您可以查看postgresql-simple snaplet。
但是,如果您确实需要创建 snaplet:
snaplet 只是一个使用基础设施的独立应用程序Snap.Snaplet
,(通常)有自己的.cabal
文件,并且(通常)是自己的 Haskell 包。然后,Snap 为您提供了一种将这个可重用、独立的应用程序嵌入或嵌套到另一个 snap 应用程序中的方法。想想俄罗斯娃娃的等级制度。
假设您执行了与我在上一节中描述的类似的操作,那么您现在 95% 已准备好转换为 snaplet。只需将您的应用程序命名为 snaplet-tickets,在另一个 snap 应用程序中公开SnapletInit
使用makeSnaplet
和使用nestSnaplet
,以在此处包含这个可重用的功能。