mix.exs
如同一般的elixir專案,記錄了相關的資訊,且可以在 deps 內看到,Phoenix已經把許多 web 相關的套件給加進來了。
其中包刮了 ecto 以及之前提到的 cowboy,以及html的模板工具等套件
defp deps do
[
{:phoenix, "~> 1.5.3"},
{:phoenix_ecto, "~> 4.1"},
{:ecto_sql, "~> 3.4"},
{:postgrex, ">= 0.0.0"},
{:phoenix_html, "~> 2.11"},
{:phoenix_live_reload, "~> 1.2", only: :dev},
{:phoenix_live_dashboard, "~> 0.2.0"},
{:telemetry_metrics, "~> 0.4"},
{:telemetry_poller, "~> 0.4"},
{:gettext, "~> 0.11"},
{:jason, "~> 1.0"},
{:plug_cowboy, "~> 2.0"}
]
end
而依照慣例,專案的程式邏輯或放在lib目錄下
lib/sample_project/application.ex
在這個檔案中,定義了我們專案運行後需要啟用的所有服務,是這個專案最上層的模組。
children中的模組會透過監督樹的機制開始運行,在運行失敗時會被母節點重新啟動。
children = [
# Ecto repository 模組
SampleProject.Repo,
# Web樣板相關的模組
SampleProjectWeb.Telemetry,
# Start the PubSub system
{Phoenix.PubSub, name: SampleProject.PubSub},
# Web相關的模組的進入點
SampleProjectWeb.Endpoint
# Start a worker by calling: SampleProject.Worker.start_link(arg)
# {SampleProject.Worker, arg}
]
lib/sample_project_web.ex
web相關模組們的進入點,包刮 controllers, views, router 等,若是共用邏輯,可以寫在這邊。
def controller do
quote do
use Phoenix.Controller, namespace: SampleProjectWeb
import Plug.Conn
import SampleProjectWeb.Gettext
alias SampleProjectWeb.Router.Helpers, as: Routes
end
end
.......
.......
lib/sample_project_web
這個目錄存放了web相關的模組,包刮controllers, views, router等。
當我們在瀏覽器下了一個請求後,他會進入lib/sample_project_web/router.ex 匹配對應的路由,例如
http://localhost:4000/ 會匹配到 PageController 下的 index 這個函式。
lib/sample_project_web/controllers/page_controller.ex
scope "/", SampleProjectWeb do
pipe_through :browser
get "/", PageController, :index
end
然後,經過 render 這個函式指定要渲染的模板,並且會對應到同 controller 名稱的資料夾下的模板,例如這邊會對應到 page/index.eex,eex 是 Phoenix 所指用的模板語言,夠過這種方式,可以把資料渲染到畫面上。
def index(conn, _params) do
render(conn, "index.html")
end
最終變會顯示頁面了。