我是Haskell和Snap的新手,我想编写一个简单的错误跟踪应用程序。我使用$ snap init
设置了Snap项目并且它可以正常工作。问题是我不知道该怎么做。
我想创建一个snaplet Tickets
,它使用数据库存储错误报告,并在我的主Web应用程序中使用该snaplet。
我阅读了有关snaplet的文档,但我无法弄清楚它们的源代码放在哪里(我想在/snaplets
目录中?如果是这样,我该如何加载它们?)。有人能指出我正确的方向吗?
答案 0 :(得分:5)
您确定需要为故障单创建单独的快照吗? snaplet基础结构适用于可重用组件,例如会话管理,身份验证,数据库访问,管理面板,用户管理等。
您打算在多个Web应用程序中使用Tickets自包含模块吗?如果是这样,那么一定要继续创建一个snaplet。
在任何情况下,听起来像你至少部分地询问如何在使用snap时组织具有多个“模块”或“部件”的项目。我将尝试在下面解决此问题。如果您觉得我错过了标记,请告诉我。
假设您不需要为故障单创建单独的快照:
对于特定于单个站点的功能,我认为您最好在当前应用程序的包和模块层次结构中创建一些模块并开发功能代码。以下是关于我最近如何组织我的快照项目的几点:
我将与数据库相关的代码放在MyApp.DB.
的模块下
命名空间。您可以拥有包含所有内容的MyApp.DB.Tickets
在Tickets模块上操作所需的数据库调用。
我将所有与UI相关的功能放在MyApp.UI.
命名空间下。您
可以放置包含MyApp.UI.Tickets
的{{1}}模块,
您的Handlers
,Splices
等等。
为了处理表单,我使用了优秀的digestive-functors库。如果您还不知道,blog post可能会对此有所帮助。
我通常在Forms
下有一个共享的UI帮助程序库,我在其中放置在所有/大多数UI模块中使用的公共代码。
我通常在MyApp.UI.Helpers
与我的应用程序公开Web UI这一事实相关的任何代码都在MyApp.UI.Forms
命名空间之外。因此,如果我的应用程序需要执行一些离线分析,我可以将它们放在MyApp.UI.
命名空间下。
在MyApp.Analysis.
下定义并导出处理程序后,您可以转到MyApp.UI.Tickets
文件并将其连接到特定路径的应用程序中。
有关如何处理数据库连接的灵感,您可以查看postgresql-simple snaplet。
但是,如果您确实需要创建快照:
snaplet只是一个使用Site.hs
基础结构的独立应用程序,(通常)有自己的Snap.Snaplet
文件,(通常)是自己的Haskell包。 Snap然后为您提供了一种在另一个快照应用程序中嵌入或嵌套这种可重复使用的自包含应用程序的方法。考虑Russian dolls的层次结构。
假设您执行了类似于我在上一节中描述的内容,您现在已经准备好转换为snaplet。只需命名您的应用程序快照程序票证,使用makeSnaplet
公开.cabal
并在另一个快照应用程序中使用SnapletInit
即可在此处包含此可重用功能。