Phoenixの構造2016年07月07日かんあきひで(35)14この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。Railsの影響を受けたMVCのフレームワークで、開発スタイルやディレクトリの構造が非常に似ています。Elixir製Webアプリケーションフレームワーク、Phoenixを始めるElixirとPhoenixでCRUDなWebアプリケーションを作る今回は、アプリケーションの作成ではなくPhoenixの構造やリクエスト処理について調べてみます。PipelinePhoenixは他のWebアプリケーションフレームワークと同様にModel-View-Controllerの構造をしています。Modelはデータにアクセスし、Viewはデータを表示すること、Controllerはリクエストを受け、変換してModelに届ける役割を持ちます。一方でリクエストを受け付けてからレスポンスを返すまでの処理の流れをプログラム上で明示的に記述します(RailsではRackに移譲することにより暗黙的に実現しています)。クライアントから送られたリクエストに対して、Phoenixはパイプラインのように一つずつ処理をして加工していきます。最終的に加工され出来上がったレスポンスをクライアントに返却します。サーバに届いたリクエストは以下の順に処理されます。controllerそれぞれの役割は以下です。endpointにまず最初にリクエストが届きますrouterでリクエストを正しいコントローラに振り分けますpipelinesでは共通処理をリクエストに対して行いますcontrollerは通常のWebアプリケーションと同じ役割ですPlugこのリクエストに対して一つずつ処理を実行する関数をPhoenixのPlugと呼びます。Plugの定義は「Plug.Conn構造体を入力してPlug.Conn構造体を出力する」です。説明したrouterやcontrollerもPhoenixではPlugとして作られています。Phoenixで作るWebアプリケーションはPlugのパイプラインで構成されているということです。ディレクトリ構造まず、プロジェクト全体のディレクトリ構造を見てみましょう。test...configディレクトリconfig.exsはアプリケーション全体にかかわる設定をするファイルです。Phoenix.PubSub.PG2]config関数はPhoenixアプリケーションの初期設定を行っています。ここでエンドポイントも設定しています。それではendpoint.exを見てみましょう、このファイルはlibディレクトリに置かれています。endリクエストに対して処理をしていくPlugが設定されています。ここに書いてあるPlugを上から順に処理していきます。アプリケーションに共通の処理を足したい場合は、共通処理を書いたPlugをここに設定すれば良いだけです。非常にわかりやすいですね。treeにより起動するプロセス、長く起動し続けるプロセスを記述したファイルを置きます。webディレクトリもう一度webディレクトリの中身を見てみましょう。web.exこのディレクトリにはおなじみのControllerやModel、Viewのファイルが配置されています。他のFWでは見たことのないchannelsディレクトリがあります。ここにはPhoenixがサポートするリアルタイム通信をするためのファイルを配置します。endendrouterはRailsと同じようにURLと処理するコントローラのルーティングを設定します。それ以外にここでは、HTMLを返却するアプリケーションとAPIアプリケーションごとにそれぞれ共通して処理するPlug関数を設定しています。:browserの中で設定したplug関数を全て処理するようにしています。endopoint.exとrouter.exを見ればリクエストに対してPhoenixが処理することがすべて分かります。Railsとの違いここまではPhoenixアプリケーションのリクエスト処理の仕組みやディレクトリ構造について調べました。Railsとの違いについて整理します。起動処理プロジェクトのルートディレクトリに配置されているmix.exを見ると、起動時にアプリケーションが呼び出しているモジュールが分かります。:postgrex]]endこれはPhoenix独自の仕組みではなく、すべてのElixirアプリケーションで共通する仕組みです。Railsとは違い、Phoenixは一つのElixirアプリケーションとして作られています。見通しの良さ起動処理やリクエストに対する共通処理はendpoint.exとrouter.exを見ればすぐに理解でき、非常に見通しの良い造りになっています。routerなどを全てPlugとして定義し抽象化したことによる成果です。アセットこれは重要なことではないですが、PhoenixはCoffeeScriptではなく、ES2015です。まとめPhoenixがRailsで成功した素晴らしい仕組みを取り入れつつ、Elixir、関数型の強みを生かした独自の構造をしていることを書いてきました。個人的にアプリケーションを書いていて印象に残ったことは、Railsに近い生産性を持ちつつ全体の仕組みが非常に理解しやすいことです。今回は書いていませんがPhoenixにはChannelというリアルタイム通信をサポートする機能があります(Rails5もActionCableでサポートされました)。今後のWebの成長とともに、成功する可能性の非常に大きいフレームワークです。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。本が出ていたので読んでみたところよかったので紹介させていただきます。使いたいときの注意点を書きました。新井成一64最近Sphinxつかってドキュメントを書いてるのですがなかなかイケています。臼田佳祐295ワークフロー自動化OSSのn8nをAWS環境で建てて検証してみました。非常に期待できるサービスです。Fargateの勉強をしています。使ってみたい方は参考にしてください。洋介255SnowflakeがAWSの東京リージョン上で稼働するようになりました。データを日本に置けます。芳賀健232こんにちは!猫様の忠実なるしもべ、芳賀健です。Tokyoで開催されました。カフェ店長のオカノです。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。