用于封装Symfony2

时间:2015-10-10 11:15:41

标签: symfony architecture saas

我想要开发什么......

我目前正在开发一个SaaS解决方案(Symfony2)来构建HTML演示文稿或更好的幻灯片演示。用户可以登录管理UI并创建演示文稿。此演示文稿可以稍后播放。演示文稿由元素组成。元素可以是图像,文本,视频,pdf等。

enter image description here

应该从用户界面封装此元素类型。因此,外部开发人员可以使用已定义的接口开发此类新模块(元素类型)并将其注入系统。

如果新模块完成,我们将其移动到symfony2目录中的特定目录,系统将检测新模块。 管理ui系统中没有硬编码的变化是必要的

每个模块都有一个自己的"产品编号"。因此,我们可以使用数据库为不同的用户启用或禁用模块。

模块必须实现哪些功能?

在管理ui中,用户可以创建演示文稿并添加不同类型的元素(模块)。用户会看到包含元素的时间轴。当他点击一个元素时,该元素的编辑器将显示在时间轴(Parent-Child-View)下。每个模块都有不同的编辑器。文本模块需要其他配置 - 而不是图像模块。

因此,在管理员界面中,我们需要编辑元素的功能:

  • createNewElement()在数据库中创建新条目(模块有自己的表,例如mod_text_elements)
  • renderEditorView()生成HTML,该HTML将显示在具有特定于模块的输入的管理ui中。例如。 image-upload / crop,WYSIWYG-editor,...
  • saveEditorInputs()模块需要处理在编辑器中输入的数据并将其保存到数据库中的元素条目
  • deleteElement()删除元素

演示文稿的输出:

稍后我们想播放这个演示文稿。因此循环遍历表示元素并询问元素的模块以及如何显示它。

  • renderPresentation()为演示文稿呈现(HTML)元素

数据库

我已经制作了一个可能的解决方案图,以保存有关数据库中模块和元素的信息。黄色实体是特定于模块的表。

ER-model

如何在Symfony2中实现这一点?

我的主意是定义一个必须由模块实现的接口。但哪个班级必须实现这个?控制器?

模块=捆绑吗?

如何实现编辑器的View-in-View?应该在管理ui的用户界面中查看模块的编辑器(例如renderEditorView())。

2 个答案:

答案 0 :(得分:4)

我是通过挂钩EventDispatcher Component来完成的。

你的主人'控制器将定义一组事件,这些事件对应于您在上面定义的标准CRUD操作... onCreateNewElement(),onRenderEditorView()等。您可能会找到更多的事件来为您提供挂钩构建您的应用程序(例如,允许插件将工具添加到工具栏)。

您定义了一个Service(这不是一个控制器类),它会寻找新的'模块'并将其正确命名的方法添加为自定义应用程序事件的侦听器。

模块是捆绑包吗?嗯,这完全取决于你。您是否要为用户提供安装'专门针对您的应用的新模块?那么模块需要看起来像完全由你决定。您是否打算将Composer放入混合模式并允许以这种方式安装模块?对结构施加了一些限制,但仍然取决于你。

如何实现View-in-View?同样,这归结为您如何定义“事件插件”的界面。以及他们对TWIG和YAML配置等资源的访问权限。

您真正要问的问题是如何在不破解现有代码的情况下向应用程序添加功能 ......答案是 EventDispatcher 。其余的由你决定。

答案 1 :(得分:0)

还有另一种方法可以使用自定义"模块扩展代码库":Dependency Injection Tags

它的工作原理如下:

  • 您创建了应用程序的核心,它实现了基本功能, registers compiler pass处理代码扩展
  • 模块可以是核心应用程序的一部分,也可以移动到外部软件包
  • 每个模块必须在DI容器中注册,并且核心应用程序支持标记,因此可以正确处理(添加菜单位置,如示例中所示的新元素类型)
  • Symfony DI编译所有服务和内容,因此所有模块都可以立即在应用程序中使用(因此您可以例如迭代已准备好的项目的集合,而无需动态构建它)。

在我看来,EventDispatcher更适合处理实时操作,例如在创建新实体时发送通知(例如,控制器/服务调度事件,某些包订阅并发送通知)。

当你想扩展核心时,我会推荐DI标签。当然,你必须构建所有的核心(接口和整个架构),因此模块可以扩展现有的服务'数据,那么你只使用你的服务。

整个Symfony全栈框架基于od this tags,所以有很多现有的代码需要调查来获取这个概念。

如果我写的很清楚,以及Symfony docs中的内容,请告诉我。如果您需要一些其他信息,我会尝试提供帮助。