YesodのMiddleware
DjangoのMiddlewareとか、SpringFrameworkのfilterみたいなもんの、Yesodのやつ、前処理をフックするための機能、コードはgithubに置いときます。
Yesod Middleware sample
認証されたユーザーのログを出力するという簡単なサンプルです。
動かしてみる
手順どおりに初期化できたら、ユーザーを作成する
作成すればログインされるので、適当なリンクをアクセスしてみる
ログを確認
mysql> select * from acc_log; +----+---------+---------------------+ | id | user_id | acc_time | +----+---------+---------------------+ | 1 | 1 | 2017-08-11 20:55:32 | | 2 | 1 | 2017-08-11 20:56:00 | +----+---------+---------------------+ 2 rows in set (0.00 sec)
簡単な説明
Yesod Middlewareの設置方法は、まず、middlewareを書く
-- src/Foundation.hs 抜粋
dbAccessMiddleware ::
(YesodAuth site,
YesodPersist site,
YesodAuthPersist site,
AuthId site ~ Key (AuthEntity site),
PersistEntity (AuthEntity site),
Typeable (AuthEntity site),
AuthEntity site ~ User,
YesodPersistBackend site ~ SqlBackend) =>
HandlerT site IO res -> HandlerT site IO res
dbAccessMiddleware handler = do
mauth <- maybeAuth
case mauth of
Nothing -> handler
Just (Entity uid u) -> do
runDB $ do
si <- get ((toSqlKey 1) :: Key SystemInfo)
case si of
Just entity -> do
case systemInfoInit entity of
True -> liftIO getCurrentTime >>= \t ->
(insert $ AccLog { accLogUserId = uid
, accLogAccTime = t }) >> return ()
False -> return ()
_ -> $(logInfo) "system_info no initialized.." >> return ()
handler
で、Yesod Middlewareにくっつける
-- src/Foundation.hs 抜粋 yesodMiddleware = defaultYesodMiddleware . dbAccessMiddlewareこんな感じで実装できる、ちなみにmaybeAuthで認証済みユーザーのEntityが取得出きる。
