スポンサーリンク

2016年10月19日

[Phoenix Tutorial v1.2]What is Phoenix Framework?

ゴール

この章で学べること…
  • Phoenixフレームワークの基礎知識を身につける
  • Phoenixフレームワークをインストールする
  • ディレクトリ構成について把握する
  • プロジェクトの作り方、サーバの実行方法を実践する

コンテキスト

この章では、Phoenixフレームワークの概要と構成について学んでいきます。

Phoenix is 何?

Phoenixフレームワークとは何なのか・・・何なんでしょうね?
それを把握するために、Phoenixフレームワークの概要や特徴、構成要素について見ていきましょう。

概要

Phoenixフレームワークについて説明をする前にElixir言語について説明をしなければいけないでしょう。
Elixir言語は、ErlangVM上で動作する関数型言語です。
ErlangVMを利用しているため、Erlang/OTPを利用することができます。
そして、Rubyライクに記述することができる言語です。
つまり、ErlangとRubyの良いとこ取りをした言語です。

Note: Erlang/OTPはエリクソンで開発された関数型プログラミング言語です。

PhoenixフレームワークはElixir言語で実装されたWebフレームワークです。
サーバをMVCパターンに沿って構築していくことができます。
その構成要素や概念の多くは、Ruby on RailsやDjangoのような他のWebフレームワークに影響を受けています。
それらのフレームワーク経験があれば、使うのにさほど苦労をすることはないと思います。
高い生産性とアプリケーションパフォーマンスの両方の長所を提供しているお得なフレームワークです。
また、リアルタイム性を提供する機能がデフォルトの構成に入っています。
もちろん、その機能を利用しないで一般的なWebサイトを構築することもできます。
これは個人的な所見になりますが、フロントエンドというよりはバックエンドでの動作を期待します。

特徴

  • RoRライク
  • MVCモデル
  • ジェネレータ(Mix Tasks)
  • ルーティング
  • テンプレート
  • Ecto(データベース用ドメイン固有言語)
  • WebSocket

構成要素

  • Endpoint
  • Router
  • Controllers
  • Views
  • Templates
  • Channels(WebSocket)
  • PubSub
構成要素の名前だけを提示されてもわかりませんね。
いつかどこかで役に立つかもしれませんので、Phoenixの構造や作りを見てみましょう。
Phoenixのサーバサイドにおけるリクエストのライフサイクルを意識しなくても実装をしていくことができますが、この情報が頭の中にあることは有益です。少なくとも害になることはないでしょう。
  • 概略図



Note: CowboyはErlang/OTPで実装されているHTTPサーバです。

Note: PlugはElixirで実装されたWebサーバのためのアダプタを提供しています。

Note: EctoはElixirで実装されたデータベースラッパでDSLです。

  • リクエストのライフサイクル



Phoenixの構造や作りは、なんとなく分かりましたか?
実際に実装をするようになったら意識してみてください。
(なお、Channelに関しては本チュートリアルでは扱っていませんのでご注意を)

Info: 導入実績

インストール

Phoenixフレームワークをインストールし、プロジェクトの生成まで行っていきます。

アーカイブ・インストール

Phoenixのインストールはmixコマンドから行うことができます。
下記を実行してください。

Example:

$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
簡単ですね。こんな簡単にインストールできてしまいます。

プロジェクトの生成

オプションの指定はなしで、一番シンプルなプロジェクトを作ってみましょう。
さきほどのインストールでmixコマンドへPhoenixのプロジェクトを生成するコマンドが追加されています。
まずはそのコマンドを確認します。

Example:

$ mix help | grep phoenix
mix local.phoenix     # Updates Phoenix locally
mix phoenix.new       # Creates a new Phoenix v1.2.1 application
二つコマンドが表示されています。
ひとつめは、Phoenixフレームワークをアップデートするときに使います。
新しいバージョンが出たら、このコマンド使ってアップデートしましょう。
ふたつめが目的のものです。こちらのコマンドを使ってプロジェクトの生成ができます。
さっそく、プロジェクトを作ってみましょう。

Example:

$ mix phoenix.new demo_app
...

Fetch and install dependencies? [Yn] y
* running mix deps.get
* running npm install && node node_modules/brunch/bin/brunch build

We are all set! Run your Phoenix application:

    $ cd demo_app
    $ mix phoenix.server

You can also run your app inside IEx (Interactive Elixir) as:

    $ iex -S mix phoenix.server

Before moving on, configure your database in config/dev.exs and run:

    $ mix ecto.create
プロジェクトを生成すると、軽く怯むくらいディレクトリやファイルが作られています。
全てを把握するのは大変ですが、次の項目で詳しく見ていきましょう。

ディレクトリ構成

プロジェクトを生成したときに作られている、各階層のディレクトリやファイルについて詳しく見ていきましょう。

各階層のディクレトリやファイル

Phoenixでプロジェクトを生成したときのディレクトリ構成は以下になります。
使っているうちに頭に入っているでしょうから、覚える必要はありません。
ここでは、こんな構成で作られているとかというのが把握できれば大丈夫です。

Example:

説明
.gitignore GitへCommitしないファイル&ディレクトリを記述するファイル
README.md 説明書
_build/ ビルドされたファイルが格納されるディレクトリ
brunch-config.js ブランチの構成、静的資産を管理するための設定用JavaScript
config/ アプリケーションの設定ファイルが格納されているディレクトリ
config.exs “共通の設定を記述するファイル
下記の設定ファイルを環境変数により
動的に呼び出し各環境に合わせた設定を持たせることができる”
dev.exs 開発版の設定を記述するファイル
prod.exs 製品版の設定を記述するファイル
prod.secret.exs 製品版で公開しない設定を記述するファイル
test.exs テストで使う設定を記述するファイル
deps/ mixの依存関係(ライブラリ)が格納されるディレクトリ
lib/ アプリケーション内で共有する機能を格納するディレクトリ
[Application name]/endpoint.ex “PhoenixにおけるWebアプリケーションへの
すべての要求を開始する境界となるファイル”
[Application name]/repo.ex データベース操作用のモジュール(実体はEcto)
[Application name].ex アプリケーションのスーパーバイザ
mix.exs アプリケーションで利用するmixの設定を記述するファイル
mix.lock 取得した依存関係のバージョンをロックするためのファイル
node_modules/ npmで取得したパッケージを格納しているディレクトリ
package.json npmの依存関係を記述するファイル
priv/ “静的資産を格納するディレクトリ
web/static配下からコピーされる
公開したくない静的資産を格納する場合、
web/staticではなくこちらを利用するとよい”
gettext/en/LC_MESSAGES/errors.po 英語用のpoファイル
gettext/errors.pot Gettextの元となるファイル
repo/ データベース用のディレクトリ
repo/migrations マイグレーションファイル格納ディレクトリ
repo/seeds.exs DBへテストデータを作成するためのファイル
static/ “静的資産を格納するディレクトリ
priv/static配下へコピーされる”
static/css cssファイルを格納するディレクトリ
static/css/app.css アプリケーションのスタイルシート
static/css/app.css.map app.cssのソースマップ
static/favicon.ico Phoenixのシンボルマーク・イメージ
static/images 画像を格納するディレクトリ
static/images/phoenix.png Phoenixのロゴ
static/js JavaScriptファイルを格納するディレクトリ
static/js/app.js アプリケーションのJavaScript
static/js/app.js.map app.jsのソースマップ
static/robots.txt ロボットファイル
test/ アプリケーションのテストに使うファイルを格納するディレクトリ
channels/ チャネルのテストファイルを格納するディレクトリ
controllers/ コントローラのテストファイルを格納するディレクトリ
madels/ モデルのテストファイルを格納するディレクトリ
support/ テストのサポートファイルを格納するディレクトリ
support/channel_case.ex チャネルを使ったテストをするときのサポートファイル
support/conn_case.ex Plug.Connを利用するときのサポートファイル
support/model_case.ex モデルを使ったテストをするときのサポートファイル
views/ ビューのテストファイルを格納するディレクトリ
test_helper.exs テストのヘルパー
web/ “アプリケーションを格納するディレクトリ
主要なプログラムはこの配下に格納”
channels/ チャネルのファイルを格納するディレクトリ
channels/user_socket.ex デフォルトで生成されているソケットハンドラ
controllers/ コントローラのファイルを格納するディレクトリ
controllers/page_controller.ex デフォルトで生成されているWelcomeページ用のコントローラモジュール
models/ モデルのファイルを格納するディレクトリ
static/ 静的ファイルを格納するディレクトリ
static/assets 静的資産を格納するディレクトリ
static/assets/favicon.ico Phoenixのシンボルマーク・イメージ
static/assets/images 画像を格納するディレクトリ
static/assets/images/phoenix.png Phoenixのロゴ
static/assets/robots.txt ロボットファイル
static/css CSSを格納するディレクトリ
static/css/app.css アプリケーションのスタイルシートを記述するファイル
static/css/phoenix.css Phoenoxがデフォルトで用意しているスタイルシート(Bootstrap v3.3.5)
static/js JavaScriptを格納するディレクトリ
static/js/app.js アプリケーションのJavaScriptを記述するファイル
static/js/socket.js WebSocket用の内容が記述されたJavaScript
static/vendor ベンダーのライブラリなどを格納するディレクトリ
templates/ テンプレートファイルを格納するディレクトリ
templates/layout アプリケーションのレイアウトを格納するディレクトリ
templates/layout/app.html.eex アプリケーションのレイアウトを記述するファイル
templates/page Welcomeページ用のテンプレートが格納されているディレクトリ
templates/page/index.html.eex Welcomeページ用のテンプレート
views/ ビューのファイルを格納するディレクトリ
views/error_helpers.ex Web画面表示の際、エラーが発生したときのヘルパー
views/error_view.ex Web画面表示の際、エラーが発生したときに使われるエラービュー
views/layout_view.ex アプリケーションレイアウトのビュー
views/page_view.ex Welcomeページ用のビュー
gettext.ex 他言語対応用のGettextファイル
router.ex ルーティングを記述するファイル
web.ex 各機能に展開する定義が記述されたファイル

Note: 静的資産についてはbrunch-config.jsの設定が必要になることが多いので注意が必要。

ファイル名の規約

Phoenixのコマンド(Mix Tasks)を使ってい生成されているファイル名について確認してみましょう。
大体の場合は、以下の規約に沿ってファイルやモジュールを作れば問題ないと思います。
何のファイルなのか分かりやすい状態にしておくと、後々幸せになれるかもしれません。
少なくとも不幸になることはないでしょう。
ディレクトリ ファイル モジュール useモジュール
web/contorollers/ xxx_contoroller.ex XxxController use [Application Name].Web, :controller
web/models/ xxx.ex Xxx use [Application Name].Web, :model
web/views/ xxx_view.ex XxxView use [Application Name].Web, :view
web/templates/xxx/ yyy.html.eex なし なし
web/channels/ zzz_channel.ex ZzzChannel use [Application Name].Web, :channel
priv/repo/migrations/ [timestamp]_create_mmm.exs CreateXxx use Ecto.Migration
test/controllers/ xxx_controller_test.ex XxxControllerTest use [Application Name].ConnCase
test/models/ xxx_test.ex XxxTest use [Application Name].ModelCase
test/views/ xxx_view_test.ex XxxViewTest use Practice.ConnCase, async: true
test/channels/ zzz_channel_test.ex ZzzChannelTest use [Application Name].ChannelCase
test/support/ なし なし なし
xxx = コントローラ名、モデル名
yyy = アクション名
zzz = チャネル名
mmm = マイグレーション名
DBテーブル名 = xxxs (モデル名の複数系)

Note: マイグレーションファイルは操作名+テーブル名などにすると分かりやすい。

ようこそPhoenixへ!

最後にPhoenixのWelcomeページを確認して、この章は終わりにしたいと思います。

Example:

>mix phoenix.server

# "Ctrl+C"で終了できます。
以下のアドレスへアクセスしてみましょう。

URL: http://localhost:4000/

ようこそPhoenixへ!!

Note: Phoenixフレームワークのデフォルトポート番号は4000です。

おわりに

次の項目では実際にPhoenixフレームワークでデモ用のアプリケーションを作成していきます。

人気の投稿