我为Yesod建立了一个库,我希望它能为信用卡处理器Stripe提供一个界面。 (我计划很快发布它。我放弃亚马逊,因为它的API记录很差......)
我创建了一个子网站和类型类来处理Stripe API所需的路由。我设法弄清楚"怎么"我需要做什么,但我不太了解它。
子网站的路由定义为:
mkYesodSubData "Stripe" [parseRoutes|
/charge/#StripeId ChargeR POST
/customer/#StripeId CustomerR POST
|]
并且父级的路由定义为:
/payment/stripe StripeR Stripe appStripe
现在,我对这条线的实际含义感到好奇。为了比较,大多数其他路线定义如下:
/questions QuestionsR GET
据我了解,路由生成器生成QuestionsR
数据类型,并将/questions
发送给getQuestionsR
。但是路由生成器到底做了什么呢
/payment/stripe StripeR Stripe appStripe
我认为必须创建StripeR
类型。我知道appStripe :: App -> Stripe
。但是这些东西扮演什么角色?解析器如何确保StripeR
将Stripe
路由中的一个作为参数?幕后发生了什么,GET
案例是另一种模式的特例?
答案 0 :(得分:1)
GET并不是我理解的特殊情况,因为我们明确创建了一个子网站资源。
有问题的行
/payment/stripe StripeR Stripe appStripe
我们将调用/ payment / stripe中的资源StripeR
,它是Stripe
(这是一个子网站),可以使用appStripe
函数进行访问。< / p>
例如,当您为子网站定义基础时,您可以执行类似
的操作data Stripe = Stripe
但你也可以这样做
data Stripe = Stripe {
getStripeConfig :: String
}
然后在主站点中,您可以在处理程序中执行
handler :: Handler Html
handler = do
app <- getYesod
let stripeConfig = getStripeConfig $ appStripe app
...