Phoenix 是一个web开发框架,写入Elixir中它执行的是服务器端模型-视图-控制器(MVC)模式。许多它的组件和概念看起来和我们熟悉的其他web框架相似,比如Ruby 写的Rails 或是 python的Django框架。
Phoenix提供了一个两全齐美的方案:高效的开发生产力和高效的应用性能。Phoenix还提供了全新的特性:像channels 可以提供实时交互的功能,预编译模版提供更高的速度。
hello_web
- Phoenix.endPoint: endpoint包含了所有请求都要经过的公共和初始路由。如果你想要在所有的请求上都添加上某些操作,请添加到此文件
- Phoenix.router: router负责分配动作/路径到控制器。router允许我们定义单独的功能区域;例如:我们的应用中有部分页面需要用户验证,其他的则不需要。
- Phoenix.Controller: controller的功能是检索请求的信息,并与业务层交互,给展示层准备数据。
- Phoenix.View:view是处理从controller获取到的结构化数据,并且将数据转化成文稿展现给用户。
Routing
Router路由是Phoenix应用中最主要的总线。他可以匹配HTTP请求到controller actions,连通实时频道处理,并且还给一些路由定义了一系列的管道转换域。
路由模块名称的定义方式为应用的名字作为前缀+Web+.Router
一条路由的书写方式:
Http操作 路由, 控制器, :action
使用$ mix phx.routes
命令可以查看应用中定义的所有路由。
resource定义路由
使用resource定义路由,可以定义一个标准的路由矩阵,格式为
resource 路由,控制器
,resource还可以嵌套定义
scope "/", HelloWeb do
pipe_through :browser
get "/", PageController, :index
resources "/users", UserController
...
end
# 执行mix phx.routes 打印的resource的结果
...
user_path GET /users HelloWeb.UserController :index
user_path GET /users/:id/edit HelloWeb.UserController :edit
user_path GET /users/new HelloWeb.UserController :new
user_path GET /users/:id HelloWeb.UserController :show
user_path POST /users HelloWeb.UserController :create
user_path PATCH /users/:id HelloWeb.UserController :update
PUT /users/:id HelloWeb.UserController :update
user_path DELETE /users/:id HelloWeb.UserController :delete
...
Pipelines
Pipelines是一组可以被关联上特殊作用域的插件;
Routes 被定义在 scopes 作用域内并且这个作用域可以穿越多个管道。一旦一个路由被匹配,Phoenix将会调用这个路由关联的所有 pipelines 插件。例如:访问 /
将会通过 :browser
管线,于是会调用虽有的插件。
Pipeline默认定义了2种类型,:browser
和 :api
,他们可以被一系列的基本的任务应用。我们可以根据自身的需求创建我们自己的 pipelines
The :browser
和 :api
pipelines
像browser和api的名字一样,:browser
pipeline是为应用在响应浏览器端渲染请求的路由而准备的,:api
pipeline是为响应产品数据 API 请求而准备的
Forward
Phoenix.Router.forward/4
宏可以被用于,将所有的以某个特殊路径开头的请求都发送到一个特殊的插件上。