【问题标题】:Where should "global" Symfony functions be placed?“全局” Symfony 函数应该放在哪里?
【发布时间】:2011-03-30 13:41:48
【问题描述】:

放置跨多个 MVC 层使用的函数的最佳做法是什么?

我最近不得不编写一些在视图和模型中都使用的统计函数。如果我将它们放在帮助器中,我会在模型层中加载帮助器,这很烦人,看起来不正确,并且在从任务中调用这些函数时完全中断(因为没有默认上下文)。如果我将它们放在顶级 lib 目录中,我将无法在视图中拨打 Stats::normalPercentile 之类的电话。

还有其他选择吗? Symfony 开发人员是否有任何关于此类功能应放置在何处的 cmet?

编辑:显然在视图中进行静态调用没有问题。我基于 Symfony 没有将它们的助手编写为类(即使在 significant discussion 之后)推断出这一点。在这种情况下,是否有放置此类文件的约定?把它们扔进lib/util?

【问题讨论】:

    标签: php symfony1


    【解决方案1】:

    静态调用有什么问题?我认为它非常适合辅助函数(比具有命名空间的函数更好)。

    在视图中收集统计数据很奇怪。你为什么不在一个动作中做呢?

    可能正确的答案取决于您要解决的问题类型(您没有解释您的助手应该做什么)。我通常将此类助手用于不需要任何额外类或调用(如“stripText”)的常见任务。

    【讨论】:

    • 我同意:视图中的静态调用没有错。如果 OP 不喜欢它,他应该创建一个帮助器来掩盖它们。
    • 我没有在视图中收集统计数据,但我正在像值的百分位数一样进行计算。我想我推断(错误地)静态调用在视图上不受欢迎,因为 Symfony 没有将它们的助手放在类中。
    【解决方案2】:

    统计计算不属于视图。考虑将它们添加到模型层。 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; ?>
    

    在一个任务中应该是一样的。

    【讨论】:

    • 请不要争论问题的基础。你能想象一个需要在模型和视图中调用的函数吗?好的。这就是我在这里所说的。关于这个特定实例是否是其中之一的争论正在减损我的问题。
    • 也许这就是为什么你被困在模型层中加载帮助器或调用静态方法的原因:) 无论如何,我对你的问题投了赞成票。我希望有人能给出一个好的答案。
    • 我最初的反应有点粗鲁。这个问题是我的一个小问题。相信我,我在这里所做的事情既合适又必要:)
    【解决方案3】:

    关于您的编辑,symfony 的帮助程序是这样编写的,以避免使用通常接触一点 PHP 的技术人员可能不熟悉的语法使视图混乱——函数是“香草”PHP 中的一等公民。这是从 Ruby on Rails 中汲取的哲学,启发了框架的这一部分。

    将文件存储在lib/ 是个人喜好,因为 symfony 并不介意,但命名法会建议 lib/vendor/yourname。

    如果它是好代码,你可能想在那个小 yourname 目录中小心翼翼地保护它...如果它真的好代码,你可能想要 package it and share it with others :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2016-03-31
      • 2012-03-04
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多