如何为许多应用程序构建Phoenix伞框架

时间:2017-04-19 09:22:18

标签: elixir phoenix-framework

我正在使用phx 1.3和伞形应用程序来构建新的产品套件。

我有一个基于Phoenix的企业级WebRTC软电话(许多键,显示器,多输入和输出音频设备选择等)。 我用Phoenix开发了一个Slack克隆消息传递应用程序原型。 两个应用程序都相当大 我需要将手机与聊天应用程序集成到一个前端,可能只是手机,只是聊天客户端,两者都是。 我需要向聊天客户端添加许多新功能 我还希望该体系结构支持使用同一客户端在呼叫服务器(基于用户)上设置其他设置,并可能支持大量管理级别设置。 我可能还会在将来添加其他应用程序,如操作员面板,日志查看器,列表继续... 客户端JS非常简单,没有前端框架。我渲染模板服务器端并通过频道推出html。

我想构建这个可插件。相同的端点和数据库。一个常见的用户体验。

我认为伞中有两个常见的应用程序,一个用于Phoenix端点和一对控制器,另一个用于主要的Repo和一些模式。我试图弄清楚为每个应用程序使用两个或更多其他应用程序会有多困难。一个用于上下文和模式,另一个用于控制器,视图,模板和早午餐资源。可能是第三方API的另一个。

为了实现这一目标,我需要为每个应用程序中的路由器进行动态调度。一种处理每个应用程序中包含的迁移的方法,可能还有更多我尚未想到的。

有人试过吗?是否有任何类似结构的开源项目?

2 个答案:

答案 0 :(得分:11)

我日常工作的灵丹妙药应用程序是一个包含13个应用程序的保护伞。

根目录是Phoenix端点和顶级路由器,它将请求转发给其他应用中定义的路由器。

这意味着应用不会分为多个层次(网络/业务/数据),而是分为垂直域切片。

随着应用程序在过去12个月内显着增长,这已经很好了。

我遇到的最大问题是Phoenix路由器在转发到其他路由器时剥离了请求的主要路径,因此我们创建了一个mount宏来与Plug路由器一起使用保持请求路径不变:

defmodule MyApp.Router do
  @moduledoc """
  Top level routing to each of the sub-systems
  """

  use Plug.Router

  plug :match
  plug :dispatch

  mount "/events/*_", Events.Router
  mount "/report/*_", Report.Router
  mount "/stats/*_",  Stats.Router
  mount "/auth/*_",   Auth.Router
end

并装载:

defmacro mount(path, router, opts \\ []) do
  quote do
    @opts unquote(router).init(unquote(opts))
    match unquote(path), do: unquote(router).call(var!(conn), @opts)
  end
end

为了简单起见,我们在一个应用程序中管理整个数据库的迁移,但是在每个应用程序中单独声明了Ecto Schemas。

Here是一个展示一些概念的项目。

答案 1 :(得分:0)

我也在开发一个相当大的伞形应用程序。而不是维护具有配置入口点的文件到每个应用程序,我想看看我是否可以使它更具动态性。所以我写了一个看起来像这样的插件:

def call(%{path_info: [path|_]} = conn, opts) do
  path = path |> String.downcase() |> Macro.camelize()
  module =
    try do
      Module.safe_concat [LocationRouting, path, Location]
    rescue
      _ -> nil
    end
  if module do
    module.call(conn, opts)
  else
    conn
  end
end

我将该插件添加到端点。然后由被调用的模块决定是否能够使用Plug.Builder

添加路由器或类似于端点的东西

您可以在此处查看完整示例:https://github.com/tverlaan/location_routing