2012-06-08 5 views
0

J'utilise actuellement le paquet fb pour écrire une application Yesod qui prend des données de Facebook. Dans mon Handler, j'ai réussi à obtenir la première étape de l'authentification au travail, mais je dois rediriger vers l'URL getUserAccessTokenStep1 retours que j'ai définis comme fbRedirUrl. Je rencontre des problèmes avec tous les retours de monad et la vérification de type pour m'assurer que je peux rediriger vers cette URL.Comment faire pour rediriger dans une monade dans Yesod?

getAccessTokenR :: Handler RepHtml 
getAccessTokenR = do 
    withManager $ \manager -> do 
    FB.runFacebookT creds manager $ do 
     fbRedirUrl <- FB.getUserAccessTokenStep1 redirUrl [] 
     liftIO $ print fbRedirUrl 
+0

ne peut pas vous suffit de retourner l'URL au niveau externe ('Handler') puis utilisez' redirect' immédiatement à ce sujet? – ScottWest

+0

@ScottWest Vous voulez en savoir un peu plus sur ce que vous voulez dire en le retournant au niveau externe? J'ai pensé à faire cela, mais je ne sais pas comment le faire avec les monades et autres – Squazic

+0

Pas assez d'espace ici, je vais essayer de répondre ci-dessous (mais je ne peux pas vraiment le tester :)). – ScottWest

Répondre

3

On dirait que si vous passez l'URL de redirection en arrière à travers les couches de gestionnaires/Facebook monade alors vous pouvez simplement le nourrir. Le type d'URL est redirigé Text, qui a une instance de RedirectUrl, nécessaires pour classe de types en utilisant la fonction redirect (comme on le voit dans le documentation).

Vous devrait être en mesure de faire ce travail avec quelque chose comme:

getAccessTokenR :: Handler RepHtml 
getAccessTokenR = do 
    url <- withManager $ \manager -> 
    FB.runFacebookT creds manager $ 
     FB.getUserAccessTokenStep1 redirUrl [] 
    redirect url 

Il n'y a pas vraiment de la magie ici, vous avez deux modèles de haut niveau en cours, on est le « avec » motif, qui localisera une utilisation de l'ressource (dans ce cas, le manager) et l'autre est le modèle « run », qui est vraiment l'utilisation des transformateurs Monad (ne vous inquiétez pas trop sur les détails de ce moment!).

Alors withManager vous donne un gestionnaire à utiliser, on peut supposer qu'il prend soin d'une certaine configuration et retrait du gestionnaire. Ceci est probablement tapé quelque chose comme

withManager :: (Manager -> Handler a) -> Handler a 

Dans ce que vous avez le coureur de facebook, qui sera typée comme:

runFacebookT :: Credentials -> Manager -> FacebookT Auth Handler a -> Handler a 

qui dit essentiellement que si vous lui donnez des lettres de créance, le gestionnaire, et quelques-uns Facebook calcul spécifique (comme obtenir l'URL de redirection) il peut traduire dans votre Monade de choix (ici nous sélectionnons Handler, parce que ce withManager veut). Dans votre cas, la variable de type a correspond au Text de l'URL de redirection. En utilisant cette paire de modèles with et run, nous obtenons le résultat que l'URL qui a été fournie en profondeur là-bas, bulles dans notre Handler monade. Ensuite, nous l'accrochons et le donnons à la fonction redirect!

+0

Yup qui a fait l'affaire! Merci! Maintenant, pour examiner le type de vérification et voir quel genre de magie vous avez tiré. – Squazic

+0

Pas de problème! J'ai ajouté un peu plus à l'explication, j'espère que cela fait un peu plus de sens pourquoi cela fonctionne réellement. – ScottWest

+0

Une autre approche serait d'utiliser 'lift' de l'intérieur de la monade intérieure. –

Questions connexes