作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
爱德华多包蒂斯塔

爱德华多为几家成功的创业公司工作过, 并拥有丰富的国际客户经验, 包括企业客户.

分享

凤凰城框架的普及速度很快, 提供像Ruby on Rails这样的框架的生产力, 同时也是其中之一 最快的框架 可用. 它打破了你必须牺牲性能来提高生产力的神话.

那么凤凰到底是什么呢?

凤凰城是一个使用长生不老药编程语言构建的web框架. 长生不老药, 构建在Erlang VM上, 用于构建低延迟, 容错, 分布式系统, 哪些是现代web应用程序越来越必要的品质. 你可以了解更多关于长生不老药 这篇博文 或其 official guide.

If you are a Ruby on Rails开发者,您绝对应该对凤凰城感兴趣,因为它承诺的性能提升. 其他框架的开发人员也可以跟随本文了解凤凰城是如何进行web开发的.

长生不老药:一个面向现代网络应用程序的rails式框架

在这篇文章中,我们将学习一些关于凤凰城的东西,如果你来自Ruby on Rails的世界,你应该记住这些东西.

不像红宝石, 长生不老药是一种函数式编程语言, 你可能要处理的最大的不同是什么. 然而, 这两个平台之间有一些关键的区别,任何学习凤凰城的人都应该意识到这一点,以便最大限度地提高他们的生产力.

命名约定更简单.

这是一个小问题,但如果您是从Ruby on Rails入门的,则很容易搞砸.

在凤凰城中,惯例是用单数形式写所有东西. 所以你会有一个" UserController "而不是像在Ruby on Rails中那样的" UsersController. 这适用于除命名数据库表以外的任何地方, 按照惯例,桌子的名字要用复数形式.

在学习了在Ruby on Rails中何时何地使用复数形式之后,这似乎不是什么大问题, 但一开始我有点困惑, 当我在学习使用Ruby on Rails时, 我相信它也让很多人感到困惑. 凤凰城可以让你少担心一件事.

路由更容易管理.

凤凰城和Ruby on Rails在路由方面非常相似. 关键的区别在于如何控制处理请求的方式.

在Ruby on Rails(和其他Rack应用程序)中,这是通过中间件完成的, 而在凤凰城, 这是通过所谓的“插头”完成的.”

插头是你用来处理连接的东西.

例如,中间件 Rails:架::记录器 在Rails中记录一个请求,而在凤凰城中可以使用 插头.日志记录器 插头. 基本上,您可以在Rack中间件中做的任何事情都可以使用插头完成.

下面是一个在凤凰城的路由器的例子:

defmodule HelloWorld.路由器做
  使用HelloWorld.网络:路由器

  管道:浏览器
    插件:接受,["html”]
    塞:fetch_session
    塞:fetch_flash
    塞:protect_from_forgery
    塞:put_secure_browser_headers
  结束

  管道:api do
    插头:accept, ["json"]
  结束

  范围"/",HelloWorld做
    pipe_through:浏览器

    get“/”,HelloController,:index
  结束

  范围"/api", HelloWorld做
    pipe_through: api
  结束
结束

首先,让我们看看管道.

这些是请求将通过的一组插头. 可以把它看作一个中间件堆栈. 这些都可以使用, 例如, 来验证请求是否需要HTML, 获取会话, 确保请求是安全的. 这一切都发生在到达控制器之前.

因为您可以指定多个管道, 您可以挑选特定路线所需的插头. 例如,在我们的路由器中,我们为页面(HTML)和API (JSON)请求提供了不同的管道.

对于不同类型的请求使用完全相同的管道并不总是有意义的. 凤凰城给了我们这种灵活性.

视图和模板是两种不同的东西.

凤凰城中的视图与Ruby on Rails中的视图不同.

凤凰城中的视图负责呈现模板,并提供使模板更容易使用原始数据的函数. 凤凰城中的视图与Ruby on Rails中的helper非常相似, 添加了呈现模板的功能.

让我们编写一个显示“Hello, World”的示例!在浏览器中显示.

Ruby on Rails:

app / 控制器 / hello_controller.rb:

class HelloController < ApplicationController
  def指数
  结束
结束

app / views / hello /索引.html.erb:

凤凰城:

web /控制器/ hello_controller.ex:

defmodule HelloWorld.HelloController做
  使用HelloWorld.网络:控制器

  Def index(conn, _params
    渲染conn,“index”.html”
  结束
结束

web /视图/ hello_view.ex:

defmodule HelloWorld.HelloView做
  使用HelloWorld.网络:查看
结束

web /模板/ hello /索引.html.eex:

defmodule HelloWorld.HelloView做
  使用HelloWorld.网络:查看

  def渲染(“索引.Html ", _assign)
    raw("

Hello, World!

") 结束 结束

您可以删除模板,并使用新的呈现函数,您将获得相同的结果. 当您只想返回文本甚至JSON时,这很有用.

模型就是数据模型.

在凤凰城, 模型主要处理数据验证, 它的模式, 它与其他模型的关系, 以及它是如何呈现的.

在模型中指定模式一开始可能听起来很奇怪, 但它允许您轻松创建“虚拟”字段, 哪些字段不持久化到数据库中. 让我们来看一个例子:

defmodule Hello凤凰城.用户做
  使用Hello凤凰城.网络模型:

  模式“用户”可以
    字段:name,:string
    字段:email,:string
    字段:password,:string, virtual: true
    字段:password_hash,:string
  结束
结束

这里我们在“使用rs”表中定义了四个字段:姓名、电子邮件、密码和password_hash.

除了“password”字段设置为“virtual”之外,这里没有太多有趣的内容.”

这允许我们设置和获取该字段,而无需将更改保存到数据库中. 这很有用,因为我们将有逻辑将该密码转换为散列, 我们将保存在“password_hash”字段中,然后将其保存到数据库.

You still need to create a migration; the schema in the model is needed beca使用 the fields are not automatically loaded into the model like in Ruby on Rails.

凤凰城和Ruby on Rails之间的区别在于模型不处理数据库的持久性. 这是由一个名为“回购”的模块处理的,该模块配置了数据库信息, 如下例所示:

配置:my_app
  适配器:星质.适配器.Postgres、
  数据库:“ecto_simple”,
  用户名:“postgres”,
  密码:“postgres”,
  主机名:“localhost”

此代码包含在特定于环境的配置文件中,例如 配置/ dev.练习 or 配置/测试.练习. 这允许我们使用回购来执行数据库操作,比如创建和更新.

回购.insert(%用户{name: "John Smith",示例:"john@example . ").com "})
  {:ok, 使用r} -> # Insertion was successful
  {:error, changeset} -> # Insertion failed
结束

这是凤凰城控制器中的一个常见示例.

我们为用户提供一个名称和一个电子邮件,回购尝试在数据库中创建一个新记录. 然后,我们可以选择处理成功或失败的尝试,如示例中所示.

为了更好地理解这段代码,您需要理解长生不老药中的模式匹配. 函数返回的值是一个元组. 该函数返回一个包含两个值的元组,一个是状态,然后是模型或变更集. 变更集是跟踪变更和验证模型的一种方法(变更集将在下一节中讨论).

第一个元组, 从上到下, 它与试图将User插入数据库的函数返回的元组的模式相匹配, 将运行其定义的函数.

我们可以为状态设置一个变量,而不是一个原子(这基本上就是Ruby中的符号)。, 然后我们将匹配成功和失败的尝试,并对两种情况使用相同的函数. 指定要匹配哪个原子,然后为该状态定义一个函数.

Ruby on Rails通过ActiveRecord将持久性功能内置到模型中. 这给模型增加了更多的责任,并且有时会使模型测试变得更加复杂. 在凤凰城, 这已经以一种有意义的方式分离,并防止使用持久性逻辑使每个模型膨胀.

变更集允许明确的验证和转换规则.

在Ruby on Rails中,验证和转换数据可能是难以发现的bug的来源. 这是因为当数据被诸如“before_create”和验证之类的回调转换时,它不是立即明显的.

在凤凰城中,您可以使用变更集显式地执行这些验证和转换. 这是我最喜欢的凤凰城功能之一.

让我们通过在之前的模型中添加一个来查看变更集:

defmodule Hello凤凰城.用户做
  使用Hello凤凰城.网络模型:

  模式“用户”可以
    字段:name,:string
    字段:email,:string
    字段:password,:string, virtual: true
    字段:password_hash,:string
  结束
  
  Def changesset (结构体, params \\ %{}
    结构体
    |> cast(params, [:name, :email, :password])
    |> validate_required([:email, :password])
  结束
结束

这里,变更集做两件事.

第一个, 它调用“强制转换”函数,该函数是允许字段的白名单, 类似于Ruby on Rails中的“strong_parameters”, 然后验证是否包含“email”和“password”字段, 使" name "字段可选. 这样,只有您允许的字段才能被用户修改.

这种方法的好处是我们不局限于一个更改集. 我们可以创建多个变更集. 一个用于注册的变更集和一个用于更新用户的变更集是常见的. 也许我们只想在注册时需要密码字段,但在更新用户时不需要.

将这种方法与Ruby on Rails中常用的方法进行比较, 您必须指定验证应该只在“创建”时运行。. 在Rails中,一旦有了复杂的模型,有时就很难弄清楚代码在做什么.

导入功能很简单,但也很灵活.

一个名为“Ecto”的库的大部分功能被导入到模型中. 模特通常在顶部有这条线:

使用Hello凤凰城.网络模型:

“Hello凤凰城.网络”模块位于“网络 / 网络”中.ex”. 在模块中,应该有一个名为“model”的函数,如下所示:

Def model do
  报价做
    使用星质.模式

    进口星质
    进口星质.变更集
    进口星质.查询
  结束
结束

在这里你可以看到我们从Ecto导入了哪些模块. 您可以在这里删除或添加任何您想要的其他模块,它们将被导入到所有模型中.

还有类似的功能,如“视图”和“控制器”,它们服务于视图和控制器的相同目的, 分别.

报价使用 关键词可能看起来很混乱. 对于这个例子, 你可以把引用看作是在调用该函数的模块的上下文中直接运行代码. 因此,这相当于在模块中编写了报价内部的代码.

使用关键字还允许您在调用代码的上下文中运行代码. 它实际上需要指定的模块,然后调用 __using__ 在调用它的上下文中运行它的模块上的. 你可以阅读更多关于 报价使用 在官方指南中.

这确实可以帮助您了解某些功能在框架中的位置,并有助于减少框架做了很多“魔术”的感觉。.

并发性是核心.

并发性在凤凰城中是免费的,因为它是长生不老药的一个主要特性. 您将得到一个可以生成多个进程并在多个核心上运行的应用程序,而无需担心线程安全性和可靠性.

你可以在《欧博体育app下载》中生成一个新过程:

产卵 fn -> 1 + 2 结束

一切后 产卵 之前, 结束 会在新的进程中运行吗.

实际上,凤凰城中的每个请求都在自己的进程中处理. 长生不老药使用Erlang VM的强大功能来免费提供可靠且高效的并发性.”

这也使得凤凰城成为运行使用网络Sockets的服务的绝佳选择, 因为网络Sockets需要在客户端和服务器之间保持一个开放的连接(这意味着你需要构建你的应用程序,以便它可以处理可能数千个并发连接).

这些需求会给基于Ruby on Rails构建的项目增加很多复杂性, 但是凤凰城可以通过长生不老药免费满足这些要求.

如果您想在您的凤凰城应用程序中使用网络Sockets,您将需要使用 渠道. 它相当于 ActionCable 在Ruby on Rails中,但设置起来不那么复杂,因为您不需要运行单独的服务器.

凤凰城使构建现代web应用程序变得轻而易举.

虽然我们主要关注的是它们之间的区别, 凤凰城与Ruby on Rails确实有一些共同之处.

凤凰城大致遵循与Ruby on Rails相同的MVC模式, 因此,既然您已经了解了主要的区别,那么找出代码的位置应该就不难了. 凤凰城也有类似Ruby on Rails的生成器来创建模型, 控制器, 迁移, 和更多的.

学习了长生不老药之后, 一旦你熟悉了凤凰城,你就会慢慢接近Ruby on Rails的生产力水平.

有几次,当我遇到一个用Ruby中的gem解决的问题时,我觉得效率不高, 而我找不到类似的长生不老药图书馆. 幸运的是,不断壮大的长生不老药社区正在慢慢填补这些空白.

凤凰城的不同之处有助于解决管理复杂Ruby on Rails项目带来的许多痛苦. 虽然它们不能解决所有问题,但它们确实有助于将你推向正确的方向. 为了提高效率而选择慢速框架不再是一个有效的借口, 凤凰让你两者兼得.

聘请Toptal这方面的专家.
现在雇佣

作者简介

爱德华多为几家成功的创业公司工作过, 并拥有丰富的国际客户经验, 包括企业客户.

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.