放置在多个MVC图层中使用的函数的最佳做法是什么?
我最近不得不编写一些在View和Model中使用的统计函数。如果我把它们放在帮助器中,我就会在模型层中加载助手,这很烦人,似乎不正确,并且当从任务调用这些函数时会完全中断(因为没有默认上下文)。如果我将它们放在顶级lib
目录中,我就会在视图中调用Stats::normalPercentile
这样的调用。
还有其他选择吗? Symfony开发者是否有任何关于应该放置这些功能的评论?
修改:显然在视图中进行静态调用没有问题。我推断这是基于Symfony没有将他们的助手编写为类(即使在significant discussion之后。)在这种情况下,是否有任何用于放置这些文件的约定?把它们扔进lib/util
?
答案 0 :(得分:7)
关于你的编辑,symfony的帮助程序是这样编写的,以避免使用通常与一些小PHP接触的技术人员不熟悉的语法来混淆视图 - 函数是'vanilla'PHP中的一等公民。这是一个源自Ruby on Rails的哲学,它激发了框架的这一部分。
在lib/
中存储文件是个人偏好,因为symfony并不介意,但命名法会建议lib/vendor/yourname
。
如果它是好的代码,你可能想在那个小yourname
目录中嫉妒地保护它...如果它是真的好的代码,你可能想要package it and share it with others: )
答案 1 :(得分:1)
静态通话有什么问题?我认为它对辅助函数来说是完美的(比函数更好,因为你有一种命名空间)。
在视图中收集统计数据非常奇怪。你为什么不在行动中这样做?
可能正确答案取决于您尝试解决的问题类型(您没有解释您的助手应该做什么)。我通常使用这些帮助程序来执行不需要任何其他类或调用的常见任务(如“stripText”)。
答案 2 :(得分:0)
统计计算不属于View。考虑将它们添加到Model层。 lib/util
或lib/model
对我来说似乎都没问题。例如,你可以有一个类PercentileSequence
,可以在你的视图和任务中重复使用数据,如下所示:
// in your action, component or task
$this->mySequence = new PercentileSequence($data);
// in your view (if PercentileSequence implements Iterator)
<?php foreach ( $mySequence as $rank ): ?>
<?php echo $rank ?>
<?php endforeach; ?>
// or use plain old array
<?php foreach ( $mySequence->getRanks() as $rank ): ?>
<?php echo $rank ?>
<?php endforeach; ?>
任务中应该是相同的。