Phoneix 是一个基于 Elixir 语言的遵循 MVC 模式的web开发框架。因此如果你有其他web开发框架比如 RoR 或者 Django的使用经验,其中的很多组件和概念会看起来很眼熟。
Phonex
融合了两种开发模式的精华 -- 惊人的开发效率和极高的应用性能。她同时还提供了一些有用的新功能,比如面向实时需求的channels
和为提升性能的模板预编译技术。
如果您已经熟悉 Elixir 语言,恭喜你,你有了一个不错的开始。如果您暂时还不熟悉,那么The Elixir guides是一个很好的起点。 在 Learning Elixir and Erlang Guide
里同样有不错的学习资源。
这篇文档的主要目的就是让您对 Phonenix 的里里外外有一个提纲挚领的了解。
Phoneix 建立在一些模块化的,扩展灵活的组件之上,包括我们接下来要谈到的 Plug
和 Ecto
。而更基础的 Erlang HTTP server, Cowboy 组件,本文档将不会涉及。
Phoenix 的各组件分工明确,职责清晰。我们将在接下来的章节中详细介绍他们,这里仅做一个快速鸟瞰:
handles all aspects of requests up until the point where the router takes over provides a core set of plugs to apply to all requests dispatches requests into a designated router
-
The Endpoint
- 处理请求到知道其到达路由部分。
- 提供一些针对到达请求的公用核心的组件。
- 将请求分发给指定的路由。
-
路由 (
the Router
)- 处理请求并分配给指定的控制器和动作(
controller/action
)。 - 生成一些
helpers
方法提示路由路径和指向的资源。 - defines named pipelines through which we may pass our requests
- Pipelines
- allow easy application of groups of plugs to a set of routes
- 处理请求并分配给指定的控制器和动作(
-
控制器 (
Controllers
)- 提供处理请求的函数(
function
),也就是action
- 动作(
Action
)- 组织数据并传递到视图(
view
)中 - 触发渲染模板
- 处理重定向
- 组织数据并传递到视图(
- 提供处理请求的函数(
-
视图(
views
)- 渲染模板
- 充当展示层
- 定义可以在模板中使用的一些
helper
方法
-
模板(
Templates
)- 如名字所示。
- 通常被预编译,很快。
-
通道(
Channels
)- 管理 sockets 让实时应用更容易。
- 和控制器概念类似,另外她支持长连接的双向通讯。
-
订阅发布(
PubSub
)- 在通道(
Chnannels
)层的下面,允许客户端订阅某一主题。 - 为第三方的订阅和发布提供统一的适配器。
- 在通道(
Plug 是一个通过可组合的模块们去构建web应用
的规范,针对这个规范,她实现了一系列可重用的模块和函数。她们提供了松耦合的功能----比如请求头的解析和日志系统。得益于小而专一的API
,plug组件们可以像管道(pipeline,类似Unix)命令那样被定义和顺序执行,她也同样能被跨项目的重复使用。
Plugs 被设计成几乎能处理任何事,从权限验证到参数预处理,甚至渲染。
Phoenix 在很多地方用到了 Plug 组件,尤其是路由(router
)和控制器(controllers
)部分。
Plug 最重要的功能之一就是为 HTTP server 提供适配器,并最终把内容呈现给终端用户,但目前 Plug 只是为 Cowboy 充当适配器,后者是 Loïc Hogui
用 erlang 编写的 HTTP server。
更详细的内容请参考 Plug Guide
Ecto 是一个数据库的中间层和查询语句的集合,通过她,我们可以读写不同的数据库,修改域值,用类型安全的方式编写复杂的查询,并保护我们免受常见的攻击,比如SQL注入
等等。。
Ecto 建立在如下四个核心概念之上;
-
信息库(Repo)
-- 一个信息库代表一个独立的数据库连接。每个数据库操作都是通过这个信息库完成。 -
模型(Model)
-- 模型是对我们数据库数据的描述信息,她定义表名列名以及每一列的类型,她同时还定义模型之间的关联信息。 -
查询(Query)
-- 查询是连接信息库和模型的纽带,能让我们优雅的从信息库拉取数据并作用在modal上。 -
变更
(Changeset)
-- 变更定义一系列的转换规则,用于处理模型数据以便于上层应用使用,包括类型转换,验证等等。。
新建的 Phoenix 应用默认使用 Ecto
和 PostgreSQL
数据库。