私は趣味のウェブプロジェクトを持っています。非常に単純な、ちょうどハスケルとWebプログラミングを学ぶために。明確にするために、私はSnapフレームワークを使用します。そして、私は、次のコード(site.com/authハンドラを)持っている:別のモナドの下のステートフルコード
auth :: MonadSnap m => m ByteString
auth = withSession $ \s -> do
Just user <- getPostParam "user"
Just password <- getPostParam "password"
if user == "demi" && password == "1234"
then redirect "/"
else redirect "/login"
withSession
は、現在のセッションを読み込み、パラメータで関数を実行します。ここで私は問題に直面しています。ユーザーは承認され、セッションs
に新しい価値を付けてコードを実行したいと思います。それを行う最善の方法は何ですか?どうしますか?下のコードもs
を使用しているとします。
もう1つの質問:ハンドラ(たとえばauth
など)やその他の機能で何らかの理由でコンテキストを透過的に使用できるようにすることはできますか?
findGoodies :: MonadSnap m => MyContext -> String -> m String
checkCaptcha :: MonadSnap m => MyContext -> m Bool
breakingNews :: MonadSnap m => MyContext -> m ByteString
は、理想的には、私は機能withContext
を持っているしたいが、コンテキストが中に変更することがあります。私は、ctx
のようなパラメータを持つすべての関数で(DB接続、セッションおよびおそらく他のような)すべてのコンテキストをプルする必要はありません要求を処理する。私は私のモナドを定義して解決するかもしれないと思いますが、スナップモナドを使う必要があります。私はそれを拡張できません(これも問題です)。
希望私は私を助けるためにかなり明確にそれを伝えます。
どのように 'withSession'が現在のセッションを読み込みますか? 'MonadSnap'インスタンス' m'がセッションへのアクセスを提供する場合、 'm'モナド内の値を返すすべての関数も同じ手段でセッションにアクセスする必要があります。 – pat
これは私がhand.Itによって作った自分のセッションです。その名前のサーバー上にクッキーとファイルとして実装されています:)私はWebの内部に触れたいので、セッション管理用のスナップサブシステムをインストールしていません。 – demi
パットのStateTに関する答えは正しいです。それが、私たちがスナップレットとHandlerモナドを作った理由です。ハンドラは実際にはフードの下のStateTです。それはあなたのためのすべての詳細の世話をする。開始するには、[snapletsチュートリアル](http://snapframework.com/docs/tutorials/snaplets-tutorial)を参照してください。 – mightybyte