Symfony 最佳实践:将这些常量放在哪里?

Symfony best practise: Where to place these constants?

我想知道我应该在哪里放置常量,例如用于映射状态,在 Symfony 中。我习惯于将它们设置在控制器中,但感觉不对,我更喜欢实体,但不是真的。

什么是对的?

这不是一个 "what do you think?" 问题,我真的很想知道 最佳实践 并感谢解释或链接源。目前两者都有效。

控制器

namespace my\bundle\Controller;

class MyController {
    const STATUS_NEW     = 1;
    const STATUs_PENDING = 2;
    // ...
}

实体 ?

namespace my\bundle\Entity;

class MyEntity {
    const STATUS_NEW     = 1;
    const STATUs_PENDING = 2;
    // ...
}

树枝中的示例:

{% set statusNew = constant('my\bundle\Controller\MyController::STATUS_NEW')%} {# or \Entity\ #}
{% if data.status == statusNew %}
    Hi, I'm new.
{% endif %}

提前致谢!

男.

答案视情况而定,但现在有 Symfony 最佳实践;特别是那里 is a section on constants vs. configuration options 完全符合您的要求。

Use constants to define configuration options that rarely change.

在 classes 中定义常量的好处是您可以在 Twig 中轻松访问它们。例如,如果你有一个 Post class 就像最佳实践中的例子,并将它的一个实例作为 post 传递给你的模板,你可以通过以下方式访问常量:

{{ constant('NUM_ITEMS', post) }}

现在,肯定有很多时候您可能想要指定可配置的选项 - 比如说,如果您正在创建一个可重用的包并希望允许覆盖这些值。所以这又取决于,但对于你的情况,Symfony 建议将它们放在你的实体中。

STATUS 常量属于实体,因此它们可以在多个上下文(例如多个控制器)中重复使用,而无需在每个控制器中重新定义常量。

恕我直言,实体本身是个好地方。对于树枝方法,在我之前的项目中,我在实体上创建了一些辅助方法来检查状态,例如:

namespace my\bundle\Entity;

class MyEntity {
    const STATUS_NEW     = 1;
    const STATUs_PENDING = 2;
    // ...

   // For each const status
   public function isNew(){
     return $this->status == self::STATUS_NEW;
   }
}

并在树枝中使用,如:

{% if data.isNew %}{# more contract form: if data.new  #}
    Hi, I'm new.
{% endif %}

而且你不在实体外暴露状态字段(封装new的逻辑)。

希望对您有所帮助。