| 原作者 | マイケル・スノイマン |
|---|---|
| 開発者 | マイケル・スノイマン他 |
| 初回リリース | 2010年 |
| 安定リリース | 1.6.24.5 [1]
/ 2023年9月14日 |
| リポジトリ |
|
| 書かれた | ハスケル |
| オペレーティング·システム | クロスプラットフォーム |
| 利用可能 | 英語 |
| タイプ | ウェブフレームワーク |
| ライセンス | マサチューセッツ工科大学 |
| Webサイト | ホームページ |
Yesod ( IPA: [je'sod] ;ヘブライ語: יְסוֺד、「基盤」) は、Michael Snoyman らによって開発された、型安全で、Representational State Transfer ( REST ) モデル ベース (Uniform Resource Locator ( URL ) がリソースを識別し、Hypertext Transfer Protocol (HTTP) メソッドが遷移を識別する) の高性能 Web アプリケーションの生産的な 開発のための、プログラミング言語 Haskell に基づく Web フレームワークです。これは、MIT ライセンスに基づいてリリースされた無料のオープン ソース ソフトウェアです。
Yesodはテンプレートに基づいてリストされたエンティティのインスタンスを生成し、Template Haskell構造を介して動的なコンテンツ処理機能を使用して、QuasiQuotesと呼ばれるドメイン固有言語(eDSL)コンテンツテンプレートをホストします。ここで、コンテンツはメタプログラミング命令によってコード式に変換されます。 [2]
また、コード式の補間を許可し、コンパイル時に完全に型チェックされるWebのような言語スニペットテンプレートもあります。[3]
Yesod は機能を別々のライブラリ(データベース、HTML レンダリング、フォームなど) に分割しているため、必要に応じて機能を使用できます。
MVCアーキテクチャ
Yesod は、ユーザー インターフェイスにモデル - ビュー - コントローラ(MVC)ソフトウェア設計パターンを使用します。
コントローラ
サーバーインターフェース
Yesod は、アプリケーションプログラミングインターフェース( API )の一種であるWeb アプリケーションインターフェース(WAI) [4]を使用して、サーブレット( Web アプリともいう) をサーバーから分離します。サーバープロトコルのハンドラーには、 Common Gateway Interface (CGI) [5]、FastCGI [6]、Simple Common Gateway Interface (SCGI) [7]、Warp [8] 、 Launch (デフォルトのブラウザーにローカルURLとして開き、ウィンドウが閉じられるとサーバーを閉じる) [9]があります。
の財団タイプ
参考文献[10]を参照してください。Yesodには、モデル・ビュー・コントローラクラスをインスタンス化するデータ型が必要です。これは基盤型と呼ばれます。以下の例では、「MyApp」という名前が付けられています。
RESTモデルは、Web パスを使用して Web リソースを識別します。ここでは、REST リソースに R サフィックス (「HomeR」など) が付いた名前が付けられ、parseRoutesサイト マップ記述テンプレートにリストされます。このリストから、ルート名とディスパッチ ハンドラー名が派生します。
Yesod は、 Template Haskellメタプログラミングを利用して、コンパイル時にテンプレートからコードを生成し、テンプレート内の名前が一致し、すべてが型チェックされることを保証します (例: Web リソース名やハンドラー名)。
mkYesod呼び出しを挿入すると、 Template Haskellプリミティブが呼び出され、ルート型メンバーに対応するコード[11]と、ディスパッチコントローラクラスのインスタンスが生成され、 GET呼び出しをHomeRにルーティングするためのディスパッチが行われ、両方を「getHomeR」として組み合わせたルーチンが生成され、名前に一致する既存のハンドラが期待されます。
こんにちは世界
Common Gateway Interface (CGI) サーバー インターフェイスに基づく「Hello, World!」プログラムの例(ハンドラーの種類は変更されていますが、考え方は変わりません)。
{- file wai-cgi-hello.hs -}
{-# LANGUAGE PackageImports、TypeFamilies、QuasiQuotes、MultiParamTypeClasses、
TemplateHaskell、OverloadedStrings #-}
import "wai" Network.Wai import "wai-extra" Network.Wai.Handler.CGI ( run ) -- 交換可能な WAI ハンドラー
import "yesod" Yesod import "yesod-core" Yesod.Handler ( getRequest ) import "text" Data.Text ( Text ) import "shakespeare" Text.Cassius ( Color ( .. ), colorBlack )
-- Foundation 型
データMyApp = MyApp
-- サイトマップ テンプレート、リスト パス、リソース名、受け入れられるメソッド
-- `mkYesod` は、ディスパッチ関数の名前の構成のために、基盤型名をパラメータとして受け取ります
mkYesod "MyApp" [ parseRoutes | / HomeR GET | ]
インスタンスYesod MyApp
-- インデント構造化 CSS テンプレート
myStyle :: [ Text ] → CssUrl url myStyle paramStyle = [ cassius | . box border : 1 px solid # { boxColor } | ] where boxColor = case paramStyle of [ "high-contrast" ] → colorBlack _ → Color 0 0 255
-- インデント構造化された HTML テンプレート
myHtml :: [( Text , Text )] → HtmlUrl url myHtml params = [ hamlet |
<!-- 開始タグまたはコマンド (' $ ' プレフィックス)
の下のインデント、またはその欠如は、 コンテンツまたはシーケンス ツリー構造を表します -->
<!-- タグ内の '.' または ' # ' プレフィックスは、CSS スタイルの "class" または "id" 属性値を導入します -->
<!-- Haskell 式の補間は、"shakespeare テンプレート" #{ expr }構文に従います -->
< p >こんにちは世界! < span . box > #{ length params} 個のパラメータがあります</ span > :
$ if null params
< p >リストするものはありません
$ else
< ul >
$ forall param < - params
< li > #{ fst param}: #{ snd param}
|]
getHomeR ::ハンドラRepHtml getHomeR = do req <- getRequest let params = reqGetParams req paramStyle <- lookupGetParams "style" defaultLayout $ do -- Widget モナド (''Writer'' モナド) にウィジェットを追加しますsetTitle "Yesod の例" toWidgetHead $ myStyle paramStyle toWidgetBody $ myHtml params
-- 異なる WAI ハンドラには ''run'' 関数のバリエーションがあります
main = toWaiApp MyApp >>=実行
# cgi テスト
エクスポートREMOTE_ADDR = 127 .0.0.1
エクスポートREQUEST_METHOD = GET
エクスポートPATH_INFO = /
エクスポートQUERY_STRING = 'p1=abc;p2=def;style=high-contrast'
./wai-cgi-hello
[10]
リソース、ルート、HTTP メソッド ハンドラー
参考文献[12] [13]を参照してください。Yesodは、Webドキュメントへのアクセスの表現状態転送モデルに従っており、大文字のRサフィックス(たとえば、HomeR)で名前が付けられたRouteコンストラクタを使用して、ドキュメントとディレクトリをリソースとして識別します。
- ルートテーブル
- parseRoutes テンプレートには、受け入れられるルート ピース、リソース名、およびディスパッチ メソッドを指定するリソースをリストする必要があります。
URL セグメント キャプチャをパラメータとして指定するには、単一セグメント キャプチャの場合は '#' プレフィックス、複数セグメント キャプチャの場合は '*' プレフィックスを指定し、その後にパラメータ タイプを指定します。
-- MyApp 基盤タイプが指定されている
mkYesod "MyApp" [ parseRoutes | / HomeR -- http メソッドが指定されていません: すべてのメソッドが受け入れられます/ blog BlogR GET POST
-- '#' プレフィックスは、ルート ハンドラー パラメーターとしてパス セグメントを指定します
/ article /# ArticleId ArticleR GET PUT
-- '*' プレフィックスは、パラメータをパスピースのシーケンスとして指定します
/ブランチ/*テキストブランチR GET
-- 文法を簡素化するために、複合型では別名を使用する必要があります。例: type Texts for ''[Text]''
| ]
- 前のテンプレートを適用すると、次のルート コンストラクターが生成されます。
データルートMyApp = HomeR -- テンプレート内では次のように参照されます: @{HomeR} | BlogR -- テンプレート内: @{BlogR} | ArticleR ArticleId -- テンプレート内: @{ArticleR myArticleId} | BranchR Texts -- テンプレート内: @{BranchR myBranchSegments}
- サポートされているすべてのHTTPメソッドに対して、 parseRoutesテンプレートからmkYesodによって生成されたディスパッチ名と一致するハンドラー関数を作成する必要があります。そのためには、説明されているように、メソッド名 (メソッドが指定されていない場合はプレフィックス "handler") をリソースの先頭に付けます (実際のバージョンではハンドラー タイプが変更されていますが、考え方は変わりません)。
-- "/ HomeR" の場合 -- http メソッドは指定されていません ⇒ プレフィックス ''handler'' を持つハンドラーが 1 つだけ
handlerHomeR :: HasReps t ⇒ハンドラーt
-- "/blog BlogR GET POST" の場合
getBlogR :: HasReps t ⇒ Handler t postBlogR :: HasReps t ⇒ Handler t
-- "/article/#ArticleId ArticleR GET PUT" の場合
getArticleR :: HasReps t ⇒ ArticleId → Handler t putArticleR :: HasReps t ⇒ ArticleId → Handler t
リクエストデータ、パラメータ、Cookie、言語、その他のヘッダー情報
文献[12]を参照
認証、承認
参照文献[14]認証プラグイン: OpenID、BrowserID、Email、GoogleEmail、HashDB、RpxNow。[15]
- 認証後に自動的にリダイレクトするための重要な設定があります。[16]
セッション
参照文献[17]セッションバックエンド: ClientSession [18] (セッションをクッキーに保存)、ServerSession [19] [20] (セッションデータのほとんどをサーバーに保存)
- >>過度の帯域幅オーバーヘッドを回避するために、本番サイトでは静的コンテンツを別のドメイン名から提供して、リクエストごとにセッションCookieを送信するオーバーヘッドを回避することができます。
セッションメッセージ
成功、失敗、または指示メッセージはセッションに保存( setMessage )することができ、存在する場合はテンプレートを通じてdefault_layoutルーチンによって表示されdefault_layout.hamlet、参照時にクリアされます。[21]
サブサイト
ワークフロー、ファイルサービス、サイト分割のための共通URLプレフィックスサブサイト。参照文献[22] [23]
組み込みサブサイト: 静的、[24] [25]認証[26]
フォーム処理、レイアウト生成
文献[27]を参照
ここでのFormタイプは、コントローラでフォーム フィールドのユーザー入力を解析および処理し、(FormResult、Widget) ペアを生成するために使用されるオブジェクトです。このペアでは、ウィジェットがエラー メッセージとマークを含むフォームの次のレンダリングのレイアウトを保持します。また、空白または既定値を含む新しいフォームを生成するためにも使用できます。
フォーム タイプは、ビューに埋め込まれる HTML スニペットの関数の形をとり、セキュリティ目的の隠しフィールドを保持します。
フォーム オブジェクトは、フィールド入力を組み合わせて順次解析するための、フィールドのApplicative – Monadic構成から生成されます。
フォームには次の 3 種類があります。
- 応用型(表形式レイアウト)
- モナディック(フリーレイアウトスタイル)は、どちらも Yesod.Form.Functions モジュールにあります。
- Yesod.Form.Input モジュールの入力 (解析のみ、ビューは生成されません)。
フィールドジェネレーターの名前はフォームタイプの頭文字と(a|m|i) それに続く (req|opt){- required or optional -}で構成され、fieldParseコンポーネントとfieldViewコンポーネントを持ちます。[28]
- この関数は、
runForm{Post|Get}フォーム フィールド入力に対してフィールド パーサーを実行し、受信したフォーム フィールド値をデフォルトとして新しいフォーム ウィジェットを提供するビューから (FormResult、Widget) ペアを生成します。関数のサフィックスは、フォーム送信で使用される http メソッドです。 generateForm{Post|Get}クライアントからの入力を無視し、空白またはデフォルトのフォームウィジェットを生成します。[ 29]
実際の関数パラメータと型は Yesod のバージョンによって変更されています。Yesod ブックとライブラリの署名を確認してください。
魔法はFormResultデータ型のApplicativeインスタンスにあり、(<*>)は結果値の場合のエラーメッセージを収集します[30]FormFailure [textErrMsg]
モナド形式は自由なレイアウトを可能にし、hiddenFieldメンバーをより適切に扱うことができる。[27]
応用形[31]の例:
-- フォームフィールドのレコード
data Person = Person { personName :: Text , personAge :: Int , personLikings :: Maybe Text }
-- フォーム タイプには、セキュリティタイプForm sub master x = Html → MForm sub master ( FormResult x 、Widget )の CSRF トークン隠しフィールドを含む、HTML スニペットを埋め込むための追加のパラメーターがあります。
{-
-- 検証関数のメッセージの場合:
@param master: renderMessage で使用する yesod インスタンス (ハンドラーの getYesod から返される値)
@param languages: renderMessage で使用するページ言語
-- オプションのデフォルト レコード:
@param mbPersonDefaults: defaults_record のみ、または空のフォームの場合は Nothing
-}
personForm :: MyFoundationType → [ Text ] → Maybe Person → FormサブマスターPerson {- 「Maybe」フィールドの場合は「aopt」(オプションのフィールド AForm コンポーネント)、 「areq」(必須のフィールド AForm コンポーネント) で「必須」属性を挿入します-} personFormマスター言語mbPersonDefaults = renderTable $ Person <$> areq textField fldSettingsName mbNameDefault <*> areq customPersonAgeField fldSettingsAge mbAgeDefault <*> aopt textareaField fldSettingsLikings mbLikingsDefault where mbNameDefault = fmap personName mbPersonDefaults mbAgeDefault = fmap personAge mbPersonDefaults mbLikingsDefault = fmap personLikings mbPersonDefaults
-- 「fieldSettingsLabel」は、初期の fieldSettings レコードを返します
-- 最近では、IsString を実装しているため、「FieldSettings」レコードは文字列ラベルから定義できますfldSettingsName = ( fieldSettingsLabel MsgName ) { fsAttrs = [ ( " maxlength" , "20 " )]} fldSettingsAge = fieldSettingsLabel MsgAge fldSettingsLikings = ( fieldSettingsLabel MsgLikings ) { fsAttrs = [( "cols" , "40" ),( "rows" , "10" )]}
customPersonAgeField =チェックvalidateAge intField
検証年齢y | y < 18 =左$ renderMessageマスター言語MsgUnderAge |それ以外の場合=右y
ビュー
表示されているタイプは古いバージョンに対応していますが、理念はそのまま残っています。
ハンドラモナドは、 HasRepsクラス[32]を実装する型のコンポーネントとして、1つ以上の形式のコンテンツを返します{ RepHtml、RepJson、RepXml、RepPlain、デュアルRepHtmlJson、ペアまたはペアのリスト、...}。[33] [34] Jsonの例:[35] [36] [37][(ContentType, Content)]
HasRepsのchooseRepのデフォルト実装は、クライアントの受け入れヘッダーの優先コンテンツタイプリストに従って返されるドキュメント表現を選択します。[32]
- ウィジェット[38]は、特定のコマンド(setTitleなど)によって、または構造( HTML)/動作(JavaScript)/スタイル(CSS )のテンプレートから作成されたHTML DOMコードスニペットであり、その型はToWidget、ToWidgetHead、またはToWidgetBodyクラスをインスタンス化します。
Widgetモナド[39]はWriter [40]のモナドとdefaultLayoutの引数に基づいており、ウィジェットを組み立てるのに役立ちます。
ツリー構造マークアップ用のインデントベースのテンプレート
- THオックスフォード括弧構文で規定されているハムレット準クォータ(コンパイル時のテンプレートHaskellコードのパーサ)[2] [41]は、インデントベースの構造化HTMLテンプレートを導入する。(ドキュメント[42]を参照)。[43]
[qq| ... |]
'$' はロジック ステートメントの行の先頭に付きます。
自動終了タグは、行の開始位置にあるタグに対してのみ生成されます。
- whamlet準引用符はWidget 式を返します。([hamlet|..|] の前に Widget に保存します)。
toWidget [hamlet|
$ doctype 5
< html >
<!-- 行の先頭のタグのみが自動的に閉じられます -->
<!-- タグ内の '.' または ' # ' プレフィックスは、CSS のようにクラス/ID 名を導入します -->
<!-- 属性内の ":boolVar:" プレフィックスは、属性を条件付きで生成します -->
<!-- Haskell 式の補間は、その名前のセクションで紹介された "shakespearean templates"
構文に従います -->
< head >
< title > #{ pageTitle } - My Site
< link rel = stylesheet href = @ { Stylesheet_route} >
< body >
< header >
^ { headerTemplate}
< section # mySectionId >
< p >< span . titleClass > _ { MsgArticleListTitle} </ span >
$ if null articles
< p :isRed:style = "color:red" > _ { MsgSorryNoArticles}
$ else
< ul >
$ forall art < - articles
< li > #{ articleNumber art} .- #{ articleTitle art}
< footer >
^ { footerTemplate}
|]
テンプレート補間 -シェイクスピアのテンプレート
参照文献[42]を参照。 これらは、中括弧内のコード式の一般的な置換パターンに従い、異なる文字のプレフィックスを使用して参照するコンテンツビューテンプレートです。
- テンプレート式
^{...} - は、指定されたパラメータを持つ同じタイプの他のテンプレートを参照します
^{template params}。 - ルート表現
@{...} - 安全な(入力された)URLは
@{HomeR}、 - メッセージ表現
_{...} - i18nメッセージのレンダリング
_{MsgMessageLabel params} - 他のHaskell式
#{...} #{haskell_expression}どの型が変換可能である必要があるかを示すHaskell式のレンダリング
- ハムレットHTMLテンプレートの場合、式タイプはText.Blaze.ToMarkupのインスタンスでなければならない[44]
- CSSテンプレートの場合、式型はText.Cassius.ToCssのインスタンスでなければならない[45]
- JavaScriptテンプレートの場合、式の型はText.Julius.ToJavascriptのインスタンスでなければならない[46]
- パラメータ補間を伴うi18nメッセージ定義(「.msg」ファイル内)の場合
<isoLanguage>、式タイプはText.Shakespeare.I18N.ToMessageのインスタンスでなければならない[47] - テキスト/プレーンテンプレート(電子メール用)の場合、式タイプはText.Shakespeare.Text.ToTextのインスタンスでなければならない[48]
式で英語以外のテキストを使用する場合は、 Unicode対応のText 型を使用する必要があります。これは、Glasgow Haskell コンパイラ(GHC) のString型のshow が、非ASCII文字をエスケープされた数値コードとしてレンダリングするためです。
- 外部ファイルテンプレート
- コンパイル時: テンプレートの内容は、コンパイル時のスプライス呼び出し$(expr)を使用して外部ファイルから読み込むことができます。[49]
- 実行時: HTMLハムレットテンプレートを除くすべてのサービス呼び出しで外部テンプレートファイルを再解析するためのリロードモードがあります。ドキュメントを参照してください。[50]
その他のテンプレート
- JavaScript、CoffeeScript、Roy用
- ジュリアス準クォータ: JavaScriptテンプレートを導入します。[51] JavaScriptの変種であるCoffeeScriptとRoy言語[52]にも固有の準クォータがあります。[ 2] [51]
- CSS用
- Cassius quasiquoter:インデントベースの構造化を備えたCSSテンプレートを導入します。[53]
- ルシウス準引用符: 標準構文とシェイクスピアテンプレートスタイルの置換を備えたCSSテンプレートを導入します。[ 54]
- TypeScriptとJSXテンプレート
- tscおよびtscJSX準引用符。UNIX派生版のみ(現時点ではWindowsには対応していない)。 [55]
- テンプレート: lt : 遅延テキスト、st : 厳密なテキスト
- 左マージン区切り文字 '|' を持つテキストのテンプレート: lbt (lazy)、sbt (strict)
ローカライズ可能なメッセージ
文献[57]を参照
Yesod アプリのメッセージはローカライズ可能 ( i18n ) です。メッセージは、メッセージフォルダ内のISOに基づいた名前のファイル( <iso-language>.msgなど) に保存する必要があります。
メッセージ エントリはEBNFパターンに従います。
-- EBNF: 識別子、{' '、パラメーター、'@'、タイプ}、":"、補間付きテキスト
ArticleUnexistent param @ Int64 :存在しない記事# { param }
- メッセージ コンストラクターは、メッセージ ラベル識別子の先頭に "Msg" を追加して形成されます。
- メッセージ データ型は、基盤型名に「Message」を追加して形成されます。
-- コード内
myMsg :: MyAppMessage -- データ型は基礎型に「Message」を追加しますmyMsg = MsgArticleUnexistent myArticleId -- コンストラクタは msg. label の先頭に「Msg」を追加します
-- ウィジェット テンプレート内
_ { MsgArticleUnexistent myArticleId }
実際のi18nサポートはスタックアプリ テンプレートにありません。メッセージをインスタンス化するには、「Foundation.hs」ファイルに追加する必要があります。[58]mkMessage "MyApp" messagesFolder isoLangDefault
ナビゲーションパンくずリスト
- ナビゲーションパンくずリスト。[59] YesodBreadcrumbsインスタンスは、ジェネレータ関数breadcrumbが各ルートのタイトルと親ルートを返すサイトに提供されなければなりません。その後、クエリ関数breadcrumbsは現在のルートのタイトルと祖先の(ルート、タイトル)のペアを返します。
検索エンジン XML サイトマップ
- 検索エンジンのXMLサイトマップ[60]では、サイトマップは、提供されたSitemapUrlレコードのリストから、検索エンジンにクロールしてほしいルートとクローラーに指示する属性を含むXMLサイトマップをhttpレスポンスとして返します。
ウェブフィードの閲覧
- Webフィードビュー(RDFサイトサマリー(RSS)-Atom)。[61]ハンドラーは、指定されたフィード構造からRepRss、RepAtom、またはデュアルRepAtomRssコンテンツ( Acceptヘッダーの優先コンテンツタイプリストで選択)を返します。
モデル
メモリ内の可変データの使用(基礎データ型内)
例えば訪問者数。参考文献[62]を参照。
データベース層
- persistentは、エンティティとキーの型を生成するためのテンプレートとスキーマの初期化を備えたデータベースアクセス層の名前です。[63] [64] [65]
PostgreSQL、SQLite、MongoDB、CouchDB、MySQLには第一級のサポートがあり、Redisには実験的なサポートがあります。[63]
データベースレイアウトは、エンティティ、フィールド、制約をリストしたテンプレートで記述されます。[66]
- リストされているすべてのエンティティに対して、自動増分とプライマリインデックス属性を持つ整数キー列「id」が生成され、エンティティ名にIdを付加したタイプエイリアスが付きます。
- リストされているすべてのエンティティについて、エンティティと同じ名前のレコード タイプが生成され、レコード フィールド名は、"personName" のようにフィールド名の前にエンティティ名が付けられて構成されます。他のエンティティからの外部キー参照用に、EntityField タイプ "PersonName" も生成されます。
- DBスキーマの更新には自動データベーススキーマ移行メカニズムがあり、これを成功させるには、既存のテーブルに列を追加するときに、 SQLレベル表記で「デフォルトの列値制約」を指定する必要があります。[67]
- 「最大1」のカーディナリティには、チェックマーク型に関する特別なメカニズムがあります。[68]
- 弱いエンティティ(存続期間が制約された所有者と子の関係にある子)はカスケード削除トリガーを特別にサポートしていませんが、Database.Persist.Classモジュールには手動で削除する関数があります。 [69]
- 自動テーブル作成、スキーマ更新、テーブル移行
- エンティティテンプレートを変更すると、自動テーブル作成によるスキーマ更新と、テンプレートコンテンツから生成されたmigrateAllプロシージャで「ALTER TABLE」 SQLコマンドをサポートするDBMSの移行が生成されます。移行対応DBMSを探すには、参考文献[63]の「移行」を参照してください。
share [ mkPersist sqlSettings 、mkMigrate "migrateAll" -- 指定された名前の移行手順を生成します] [ persist |
User -- テーブル名とエンティティ レコード タイプ-- 暗黙的な自動増分列 "id" を主キーとして、UserId と入力identテキスト-- データベース テーブル列 "ident" を参照します。-- テーブル名の前に "userIdent" を付けたレコード フィールドを生成します。 passwordテキストMaybe -- Maybe は Null 可能フィールドを示します。UniqueUser ident -- スペース区切りの一意制約。フィールド シーケンス
電子メール- テーブル名とエンティティ レコード タイプ- 暗黙的な自動増分列「id」を主キーとして、EmailId電子メールテキストユーザーユーザー IDと入力- 他のテーブルを指定することで外部キー EntityField タイプverkeyテキスト多分
newlyAddedColumnテキスト"default='sometext'::character varying" -- sql レベルのデフォルト制約
UniqueEmail電子メール-- 一意制約| ]
- Esqueleto:永続的なリレーショナルクエリを正しく生成するためのHaskellコンビネータレイヤーです。[70]
永続的なrawSQLとEsqueletoクエリの例。[71]
電子メール
以下のパッケージはyesod-platformの一部です: [72]
- email-validate: メールアドレスを検証します。[73]
- mime-mail: MIME電子メールメッセージを作成して送信します。[74]
フェイスブック
- fbライブラリとYesod間の便利な接着関数。[75]
開発サイクル
新しいYesodアプリはHaskellStackツール[76]テンプレートから生成され、以前のコマンド「yesod init」を置き換えます。
スタックベースのアプリ。テンプレート名には yesod がプレフィックスとして付きます (「yesod-{minimal | postgres | sqlite | mysql | mongo | ...}」)。
- HaskellStack はデフォルトでstackageリポジトリを使用するため、 hackageリポジトリの追加パッケージは「stack.yaml」のextra-depsセクションで参照する必要があります。
- パッケージはローカル サブフォルダーにカスタマイズできます。これらは、「stack.yaml」パッケージセクションで参照する必要があります。
「Yesodヘルパー」ツール
- Yesodヘルパーツール[77 ]
yesod develプロジェクト サイトから実行され、ファイル ツリーが変更されるたびにプロジェクトが再コンパイルされ、再起動されます。yesod add-handlerプロジェクトに新しいハンドラーとモジュールを追加し、「アプリケーション」モジュールにハンドラーのインポート句を追加します。
Keter を使用したデプロイ: Web アプリケーション サーバー モニターとリバース プロキシ サーバー
参照文献[78] [79] [80]
Keter は、Yesod Web アプリケーションサーバーの展開と再起動、およびWeb アプリケーションごとにPostgreSQLのデータベース作成を処理するサービスとしてのプロセスです。
コンソール コマンドはyesod keter、Web アプリを keter バンドルとしてパックし、「incoming」という名前の keter フォルダーにアップロードします。
Keter は「受信」フォルダを監視し、アプリを一時的なフォルダに解凍し、Web アプリにリッスンするポートを割り当てて起動します。
当初はNginxをリバースプロキシ(keterバージョン0.1*)として動作させ、仮想サーバーエントリを構成に追加してNginxにリロードさせていましたが、現在はKeter自体が独自のリバースプロキシ機能を提供し、Nginxへの依存を排除してメインのWebサーバーとして機能しています。[81]
古いドキュメント(Nginxベース)。[82] [83]
との統合JavaScript関数型言語から生成された
文献[84] [85] [86]を参照
参照
参考文献
- ^ 「yesodweb/yesod」.
- ^ abc "HaskellWiki - QuasiQuotation". Haskell.org. 2012-05-26 . 2012-10-23閲覧。
- ^ 「ケント大学 - Web フレームワークに対する動的言語アプローチと静的言語アプローチの比較 - Yesod と Ruby on Rails」(PDF) 。2012年 10 月 23 日閲覧。
- ^ 「wai パッケージ」。Hackage.haskell.org。2012年 10 月 23 日閲覧。
- ^ 「CGI WAI ハンドラーを備えた wai-extra パッケージ」。 Hackage.haskell.org 。2012 年 10 月 23 日閲覧。
- ^ 「wai-handler-fastcgi パッケージ」。 Hackage.haskell.org 。2012 年 10 月 23 日閲覧。
- ^ 「wai-handler-scgi パッケージ」。 Hackage.haskell.org 。2012 年 10 月 23 日閲覧。
- ^ 「warp パッケージ」。Hackage.haskell.org。2012年 10 月 23 日閲覧。
- ^ 「wai-handler-launch パッケージ」。 Hackage.haskell.org 。2012 年 10 月 23 日閲覧。
- ^ ab "book - Basics". Yesodweb.com . 2012年10月23日閲覧。
- ^ mkYesod コード
- ^ ab 「book - Routing and Handlers」。 Yesodweb.com 。 2012年10月23日閲覧。
- ^ 「ルートとリンクで遊ぶ」 FPComplete.com. 2012-10-17 . 2012-10-28閲覧。
- ^ 「書籍 - 認証と承認」。 Yesodweb.com 。2012年10月23日閲覧。
- ^ 「yesod-auth パッケージ」。 Hackage.haskell.org 。2012 年 10 月 26 日閲覧。
- ^ 「書籍 - セッション - 「Ultimate Destination」のセクションを参照」。 Yesodweb.com 。2012年11月17日閲覧。
- ^ 「セッション」。 Yesodweb.com 。 2012年10月23日閲覧。
- ^ "Web.ClientSession". Hackage.haskell.org . 2012年10月25日閲覧。
- ^ 「ServerSession: セキュアなモジュール型サーバーサイドセッション」 Hackage.haskell.org . 2018年10月29日閲覧。
- ^ "Web.ServerSession.Frontend.Yesod". Hackage.haskell.org . 2018年10月29日閲覧。
- ^ 「セッションメッセージ」。 Yesodweb.com 。 2018年10月23日閲覧。
- ^ 「サブサイトの作成」 Yesodweb.com 。 2012年10月25日閲覧。
- ^ 「Yesod とサブサイト: 考えるまでもない」 Monoid.se. 2012-08-22 . 2012-10-28閲覧。[]
- ^ 「Yesod の魔法、パート 2 - 「静的サブサイト」セクションを参照」。 Yesodweb.com。 2010 年 12 月 25 日。 2012 年 10 月 25 日閲覧。
- ^ 「パッケージ yesod-static - 静的サブサイト」 Hackage.haskell.org . 2012 年 10 月 25 日閲覧。
- ^ 「パッケージ yesod-auth - Auth サブサイト」 Hackage.haskell.org 。2012年 10 月 25 日閲覧。
- ^ ab "book - Forms". Yesodweb.com . 2012年10月23日閲覧。
- ^ "Yesod.Form.Fields". Hackage.haskell.org . 2012年10月23日閲覧。
- ^ 「Yesod.Form.Functions runFormPost」 Hackage.haskell.org . 2012年10月25日閲覧。
- ^ "Yesod.Form.Types". Hackage.haskell.org . 2012年10月23日閲覧。
- ^ 「HaskellWiki - Applicative functor」. haskell.org . 2012年10月24日閲覧。
- ^ ab 「HasReps クラス」。Hackage.haskell.org。2012年 10 月 23 日閲覧。
- ^ 「RESTful コンテンツ」。 Yesodweb.com 。 2012 年 10 月 23 日閲覧。
- ^ 「ToContent クラス」。Hackage.haskell.org。2012年 10 月 23 日閲覧。
- ^ 「More Client Side Yesod: todo sample」. Yesodweb.com. 2012-04-23 . 2012-10-23閲覧。
- ^ 「JSON Web サービス」。 Yesodweb.com 。 2012 年 10 月 23 日閲覧。
- ^ 「yesod-json パッケージ」。 Hackage.haskell.org 。2012 年 10 月 23 日閲覧。
- ^ 「book - Widgets」。 Yesodweb.com 。 2012年10月23日閲覧。
- ^ 「ウィジェットモナド」 Hackage.haskell.org . 2012年10月23日閲覧。
- ^ 「Writer モナド」。Haskell.org。2012年 10 月 23 日閲覧。
- ^ 「Template Haskell 準引用」。Haskell.org 。 2012年11月2日閲覧。
- ^ ab "book - Shakesperean templates". Yesodweb.com . 2012年10月23日閲覧。
- ^ 「The hamlet template module」. Hackage.haskell.org . 2012年10月23日閲覧。
- ^ 「Class Text.Blaze.ToMarkup」。Hackage.haskell.org 。 2012年10月23日閲覧。
- ^ 「Class Text.Cassius.ToCss」。 Hackage.haskell.org 。2012年10月23日閲覧。
- ^ 「Class Text.Julius.ToJavascript」。Hackage.haskell.org 。 2012年10月23日閲覧。
- ^ 「Class Text.Shakespeare.I18N.ToMessage」。Hackage.haskell.org 。 2012年10月24日閲覧。
- ^ 「Class Text.Shakespeare.Text.ToText」。Hackage.haskell.org 。 2012年10月24日閲覧。
- ^ 「Template Haskell」. haskell.org . 2012年11月3日閲覧。
- ^ 「book - Shakesperean templates # Calling shakespeare」. Yesodweb.com . 2012年10月23日閲覧。
- ^ ab 「Julius テンプレートモジュール」。 Hackage.haskell.org 。 2012 年 10 月 23 日閲覧。
- ^ 「Roy language」 Roy.brianmckenna.org . 2012年10月23日閲覧。
- ^ 「Cassius テンプレート モジュール」 Hackage.haskell.org . 2012 年 10 月 23 日閲覧。
- ^ 「Lucius テンプレート モジュール」。Hackage.haskell.org。2012年 10 月 23 日閲覧。
- ^ 「Typescript テンプレート モジュール」。Hackage.haskell.org。2018年 10 月 10 日閲覧。
- ^ 「Shakespeare プレーンテキストテンプレートモジュール」。Hackage.haskell.org 。 2012年10月24日閲覧。
- ^ 「book - Internationalization」。 Yesodweb.com 。 2012年10月23日閲覧。
- ^ mkメッセージ
- ^ 「yesod-sitemap パッケージ」。 Hackage.haskell.org 。2012 年 10 月 26 日閲覧。
- ^ 「RSS / Atom ビュー用の yesod-newsfeed パッケージ」。Hackage.haskell.org。2012年 10 月 26 日閲覧。
- ^ 「書籍 - 基礎データ型でのデータの初期化」。 Yesodweb.com 。 2014 年 5 月 26 日閲覧。
- ^ abc "book - Persistent". Yesodweb.com . 2012年10月23日閲覧。
- ^ 「Yesod-persistent パッケージ」。 Hackage.haskell.org 。2012 年 10 月 23 日閲覧。
- ^ 「Yesod-persistent docs」. github.com . 2018年10月16日閲覧。
- ^ 「Yesod-persistent entity syntax」. github.com . 2018年10月16日閲覧。
- ^ 「フィールドのデフォルト値の冗長移行」。GitHub.com。2012年 12 月 4 日閲覧。
- ^ 「Checkmark 型での persistent における「最大 1」カーディナリティの強制」 Hackage.haskell.org 。2018年 10 月 16 日閲覧。
- ^ 「Yesod/Persistent を使用して外部キー制約を作成するにはどうすればいいですか?」。stackoverflow.com。2018年 10 月 16 日閲覧。
- ^ 「esqueleto パッケージ」。Hackage.haskell.org。2012年 10 月 23 日閲覧。
- ^ 「クエリの例」。Stackoverflow.com。2012年9月19日。 2012年10月23日閲覧。
- ^ 「yesod パッケージ」 。Hackage.haskell.org。2019年 6 月 26 日閲覧。
- ^ 「email-validate パッケージ」。 Hackage.haskell.org 。2012 年 10 月 26 日閲覧。
- ^ 「mime-mail パッケージ」。Hackage.haskell.org。2012年 10 月 26 日閲覧。
- ^ 「yesod-fb パッケージ」。Hackage.haskell.org。2012年 10 月 26 日閲覧。
- ^ Haskell Stack - インストール方法
- ^ ヘルパーツール付きの yesod-bin パッケージ (スタックツールの使用方法の説明付き)
- ^ 「書籍 - Webアプリケーションのデプロイ」 Yesodweb.com 。 2012年10月23日閲覧。
- ^ Readme.Md. 「Yesod keter readme」。GitHub 。 2012年10月23日閲覧。
- ^ 「keter パッケージ」。Hackage.haskell.org。2012年 10 月 23 日閲覧。
- ^ 「Keter の最新情報」 Yesodweb.com 2012-10-25 . 2012-10-25閲覧。
- ^ 「Keter: Web App Deployment」。Yesodweb.com。2012 年 5 月 11 日。2012年 10 月 23 日閲覧。
- ^ 「Keter: It's Alive!」 Yesodweb.com 2012年5月17日. 2012年10月23日閲覧。
- ^ 「Javascript オプション」。github.com。2014年 3 月 12 日閲覧。
- ^ 「Yesod、AngularJS、Fay」。yesodweb.com。2012年10月30日。 2014年3月12日閲覧。
- ^ 「HaskellWiki - JavaScript の問題」。haskell.org。2014年 4 月 12 日閲覧。
外部リンク
- 公式サイト
- プレゼンテーション: InfoQ、Haskell eXchange 2012
- スライド: ジョンズ ホプキンス大学の ACM - Yesod を使用した ReST フルな Web サイト
- スクリーンキャスト: Yesod 1.0 (Vimeo にて)
- O'Reilly 電子書籍 - Haskell と Yesod による Web アプリケーションの開発 - 安全性重視の Web 開発
- Q&A: StackOverflow.com - Yesod タグ付き Q&A
ブログチュートリアル
- FPComplete.com - ルートとリンクで遊ぶ私の最初の Web サイト
- 初心者のための Yesod
- hamberg.no - handlerToIO: Yesod ハンドラで forkIO を使用する
比較
- HaskellWiki - Haskell ウェブフレームワーク
- Haskell Webフレームワークの公平かつ有用な比較
- ケント大学 - Web フレームワークに対する動的言語アプローチと静的言語アプローチの比較 - Yesod と Ruby on Rails
その他の言語
- Haskell Biblio。 - Yesod (スペイン語)カディス大学
Linuxディストリビューション
- Debian の Yesod
- Ubuntu の Yesod
