Zend框架中的小部件 - 它们应该放在哪里?

3
我已经使用Zend框架(使用Doctrine作为ORM)工作了相当长的时间,并完成了一些相关项目。
在即将到来的几个项目中,我需要类似WordPress小部件的功能。您可以拥有一个帖子/页面,看起来像这样:
Subscribe to my newsletter:
[subscribe/]

View my events
[events limit=5 sort=date/]

View this page's comments
[comments/]

在这里,订阅小部件将被替换为Blog::subscribeWidget,并且事件可以替换为Events::eventsWidget等。

过去几周,我一直在想如何做到这一点?我想出了以下几个选项:

  1. 我可以将小部件放在控制器中,然后像操作一样调用它们。问题在于代码可能会在控制器之间飞来飞去,据我所读,由于分派的数量很多,这是昂贵的。

  2. 我可以将小部件作为视图助手放置。因此,在视图中,我可以有$this->renderPage($Page),然后处理所有小部件。问题在于如果小部件需要执行一些业务逻辑(例如发布新评论),那么这真的不应该在视图中吗?

  3. 另一个选择是将小部件放在模型中?但是它们如何呈现要显示的内容呢?

当出现以下情况时,会有额外的复杂性:

  1. 例如,评论小部件还将处理评论的发布、删除等。

  2. 例如,在事件列表中,如果我想使用方法#2(视图助手)对下一页事件进行ajax请求,这该怎么办?

2个回答

5
如果我理解正确,您的小部件将需要它们自己的操作控制器,其中包含获取要显示的数据、解析表单提交等逻辑。在这种情况下,小部件和页面之间的区别在于呈现方式,即作为HTML片段而不是整个页面;您可以使用Action View Helper实现此功能。
如果您的小部件包括一个表单,它应该使用AJAX将表单数据提交回服务器,以便使用小部件时不会导致用户意外离开页面。您可以通过在小部件的视图和/或操作中使用Head Script Helper将所需的JavaScript注入到包含小部件的页面中。

嗨,Richard,感谢您的回复,我非常感激。我让您的回复、问题和进一步的用例在我的脑海中煮了一段时间,最终得出了一个解决方案。现在回过头来看,这基本上就是您所提到的。所以谢谢您,我将在接下来的几分钟内发布详细的解决方案作为另一个答案。 - balupton
很高兴你觉得我的回答有用。或许你可以投票支持一下,这样可以提高我的声誉值一点儿 ;) - Richard Turner
会的...当我能够获得足够的声望来投票时! - balupton

0

我把Richard的回复、问题和进一步的用例在脑海中沉淀了一段时间,最终找到了解决方案。

我将拥有以下视图助手和方法:

Content;带有方法:render、renderWidgets、renderWidget、renderCommentsWidget(评论)。
Event;带有方法:renderEventsWidget(多个事件)、renderEventWidget(一个事件)
Subscription;带有方法:renderSubscribeWidget(订阅表单)。

我将在我的配置文件中添加:

app.widgets.comments.helper = content
app.widgets.subscribe.helper = subscription
app.widgets.events.helper = event

我还将拥有以下模型:

Content 用于所有页面。
Event 用于所有事件。
Subscriber 用于订阅内容。

因此,在我的视图中,我会这样做:

echo $this->content()->render($this->Content)

Content::render() 将执行任何内容渲染,然后通过传递给 Content::renderWidgets() 来执行小部件的渲染。在这里,我们将使用 app.widgets 的配置来将小部件 bbcode 标记与其相应的视图助手链接起来(使用命名约定 'render'.ucfirst($tag).'Widget')。例如,Content::renderCommentsWidget() 将继续渲染评论。

也许以后我会决定拥有一个小部件视图助手,以及每个小部件的单独视图助手,例如ContentCommentsWidget视图助手。但现在这只会增加不必要的复杂性。

现在来回答我提到的AJAX问题。比如评论小部件允许通过ajax发布评论。它将在Content Controller中具有适当的方法。因此,我们还有Event和Subscription控制器-与视图助手相对应。视图助手和控制器之间的交互都将是硬编码的,没有软编码的目的。

我希望这能帮助其他人,当前计划是使使用所有这些内容的项目成为开源项目。所以也许有一天你可以看到它们全部运作。

谢谢。


更新:

您可以在以下存储库中找到这些想法的源代码:

  • BalCMS - 这是实际的 CMS,其中包含 /application/modules/balcms/view/helpers 中的小部件以及 /application/modules/config/application/balcms.yaml 中的配置
  • BalPHP - 这是资源库,其中包含 /lib/Bal/View/Helper/Widget.php 中的小部件视图助手

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接