Phoenixガイドラインを読んでみた(1) - Up And Running -

## はじめに

[前回](http://qiita.com/dynamitecoolguy/items/2f468445e7a311e5f8d1)、Ubuntu16.04にPhoenixをセットアップしてみました。
今回は、Phoenixの公式ガイドラインを見ながら、構成などを確認していきます。
[次回](http://qiita.com/dynamitecoolguy/items/0a10b3ab9c248e348c3e)はガイドラインAdding Pagesです。


## 上、および、走ること

Phoenixフレームワークの[Up And Running](http://www.phoenixframework.org/docs/up-and-running)の内容を確認していきます。
確認すると言っても、前回セットアップが終わってますので、以下の手順で最初のページ(`localhost:4000`)が表示されるようになるはずです。

なお、一部[Adding Pages](http://www.phoenixframework.org/docs/adding-pages)の内容も先取りしてます。


```shell-session
$ mix phoenix.new hello_phoenix
$ cd hello_phoenix
$ mix ecto.create
$ mix phoenix.server
```

### 概念

- **Endpoint** リクエストを処理するための入り口。Plugの管理や、Routerへのディスパッチを行う
- **Router** リクエストを解析して、適切なController/Actionにディスパッチする。パスやURL生成などのヘルパー提供。リクエストを処理するPipelineを定義する
 - **Pipeline** Plugをグループ化して、ルートのセット毎に適用できる
- **Controller** リクエストを処理するAction関数を提供する
 - **Action** データを準備してViewに渡す。Viewを介してレンダリングする。リダイレクトを行う
- **View** Templateをレンダリングする。表示レイヤ。表示のためのヘルパ関数提供
- **Template** その名の通り。事前のコンパイルされているので早い
- **Channel** 双方向通信のためのソケット管理。Controllerに同様の役割
- **PubSub** PubSub用の仮想レイヤーを提供

### その他ライブラリ

- **Plug**
 - WebApplicationを作るためのモジュール群
 - 単純で軽量なので、Pipelineにおいて複数を階層的に配置することが可能
 - 認証、パラメータの前処理、レンダリングまでいろいろ書くことができる
 - 現在は[Cowboy](https://github.com/ninenines/cowboy/blob/master/README.md)専用 

- **Ecto** いわゆるDBラッパー
 - **Repo** DBへの接続を表す
 - **Model** データモデル
 - **Query** ModelとRepoをつなぐquery
 - **Changeset** Modelのデータをアプリケーションで使う前に加工するための定義。型変換やバリデーションなど

### ソースツリー

ディレクトリ`hello_pheonix`直下は、次のようになっています。

```
├── README.md
├── _build/
├── brunch-config.js
├── config/
├── deps/
├── lib/
    ├── hello_phoenix
    │   ├── endpoint.ex
    │   └── repo.ex
    └── hello_phoenix.ex
├── mix.exs
├── mix.lock
├── node_modules/
├── package.json
├── priv/
    ├── gettext/
    │   ├── en/
    │   └── errors.pot
    ├── repo/
    │   ├── migrations/
    │   └── seeds.exs
    └── static/
        ├── css/
        ├── favicon.ico
        ├── images/
        ├── js/
        └── robots.txt
├── test/
└── web/
```

- **_build/** ビルドした結果の出力先
- **brunch-config.js** [brunch.io](http://brunch.io/)のconfigファイル
- **config/** アプリケーションの環境(devとかprod)共通設定と、環境別設定の配置先
- **deps/** erlang/elixirの依存ライブラリの展開先
- **lib/** Endpointなどを提供。web/が更新を検知すると自動的にビルドするのに対して、libは更新を自動的には検知しない
- **mix.exs**と**mix.lock**  mix用ファイル
- **node_modules/**  Node.js用ファイル
- **package.json** npm用ファイル
- **priv/** 静的リソースの配置場所。ビルド時に必要であればweb/以下にコピーされる
- **test/** unittest用
- **web/** メインとなる作業場所。下記参照

### ソースツリー(web)

```
hello_phoenix/web/
├── channels/
│   └── user_socket.ex
├── controllers/
│   └── page_controller.ex
├── gettext.ex
├── models/
├── router.ex
├── static/
│   ├── assets/
│   ├── css/
│   ├── js/
│   └── vendor/
├── templates/
│   ├── layout/
│   └── page/
├── views/
│   ├── error_helpers.ex
│   ├── error_view.ex
│   ├── layout_view.ex
│   └── page_view.ex
└── web.ex
```

- **channels/** Channel用ファイルを格納
- **controllers/** Controller用ファイルを格納。開発(dev)環境では、リクエスト時に更新があれば自動的に再ビルドされる(template, viewも同様)
- **gettext.ex** I18N用
- **models/** Model用ファイル
- **router.ex** Routerファイル
- **static/** privディレクトリからビルド時に必要なファイルがコピーされる
- **template/** Template用ファイル。自動再ビルドの対象
- **view/** View用ファイル。自動再ビルドの対象
- **web.ex** ControllerやViewといったモジュールの定義を行うファイル。`use HelloPhoenix.Web, :controller`のように使用する

-----
*とりあえず間違いがあれば後で修正・追記する*