【问题标题】:Symfony best practise: Where to place these constants?Symfony 最佳实践:在哪里放置这些常量?
【发布时间】:2015-03-03 14:54:44
【问题描述】:

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

什么是正确的?

这不是“你怎么看?”-问题,我真的很想知道最佳实践并感谢解释或链接来源。目前两者都有效。

控制器

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;
    // ...
}

twig 中的示例:

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

提前致谢!

M.

【问题讨论】:

    标签: symfony oop model-view-controller doctrine-orm twig


    【解决方案1】:

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

    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的逻辑)。

    希望对您有所帮助。

    【讨论】:

    • 或者在界面中,如果你正在使用它们,然后用self::MY_CONSTANT引用。这样,常量就不会直接与特定的类相关联,而是与预期的用法相关联。
    • 这似乎是合适的解决方案,但是,就像 Qoop 所说,您应该改用self::STATUS_NEW。此外,getIsNew 是一个糟糕的函数命名。你应该打电话给他们isNewisPending。在twig中可以直接调用{% if data.new %}
    • 当然,感谢@Qoop 对常量使用的澄清,感谢 Touki 对方法名称中的错误。我更新我的答案
    • 当然,感谢 Qoop 对常量使用的澄清,感谢 @Touki 对方法名称中的错误。我更新我的答案
    【解决方案2】:

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

    使用常量来定义很少更改的配置选项。

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

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

    现在,您肯定有时需要指定可配置选项 - 例如,如果您正在创建一个可重用的捆绑包并希望允许覆盖这些值。因此,这又取决于您的情况,但对于您的情况,Symfony 建议将它们放在您的实体中。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多