Architecture Symfony2 Doctrine2过滤器和规则的正确实体设计

Architecture Symfony2 Doctrine2过滤器和规则的正确实体设计,architecture,symfony,doctrine-orm,Architecture,Symfony,Doctrine Orm,所以我想做下面的工作,我只是在寻找如何设计它的建议 我有Filters,可以在某些实体类型上运行 过滤器s有规则s来定义其行为 使用流程实体的规则筛选流程实体,并返回布尔值 作为一个具体的例子,我可能想过滤一个给定字段上的某个正则表达式被拒绝,我可以为它定义规则。我也可以有不同的规则,在同一个过滤器中使用简单的前缀匹配 所以我得出了以下结论 interface FilterInterface { /** * Load the rules for this filter

所以我想做下面的工作,我只是在寻找如何设计它的建议

  • 我有
    Filter
    s,可以在某些实体类型上运行
  • 过滤器
    s有
    规则
    s来定义其行为
  • 使用流程实体的规则筛选流程实体,并返回布尔值
  • 作为一个具体的例子,我可能想过滤一个给定字段上的某个正则表达式被拒绝,我可以为它定义规则。我也可以有不同的规则,在同一个过滤器中使用简单的前缀匹配
所以我得出了以下结论

interface FilterInterface
{
    /**
     * Load the rules for this filter
     */
    function loadRules();

    /**
     * Filter an entity in an optional context
     * @param mixed $entity Should return true for $this->supportsEntity($entity)
     * @param array $context Other information
     * 
     * @return boolean True if the $entity passes this filter
     */
    function filter($entity, $context = array());

    /**
     * Check if filter supports the entity type
     * @param mixed $entity
     * 
     * @return boolean true if this Filter can be run for that entity type
     */
    function supportsEntity($entity);
}
然后我计划:

class ImageFilter implements FilterInterface
它将从数据库加载规则并实现过滤器

所以最初我想有一个像

过滤器规则

  • 作用域(枚举类型,用于定义使用此值的筛选器)
  • 类型(可以有不同类型的规则,比如我提到的正则表达式和前缀)
  • 值(字符串,取决于规则的类型)
ImageFilter
将加载
FilterRule
s,其中范围设置为某个常量。然后,
ImageFilter
将一个接一个地检查过滤器的类型并将其应用于实体。下面的psuedocode演示了这一点

public function filter($entity)
{
    foreach ($this->rules as $rule) {
        switch($rule->getType()) {
            case RULE_TYPE_REGEX:
                $this->doRegex();
            break;
            case RULE_TYPE_PREFIX:
                $this->doPrefix();
            break;
        }
    }
}
但是我想知道,实体是否应该负责上面的
开关
块?所以它会变成这样:

public function filter($entity)
{
    foreach ($this->rules as $rule) {
        $rule->process($entity);
    }
}
对我来说,这似乎更清晰,只要“范围”正确,过滤器不关心新规则以及如何处理它们但我的印象是实体应该是简单的POPO,因此,拥有这种逻辑似乎是一种糟糕的模式(但我从来没有100%确定一个实体真正应该做多少)

我还考虑过使用,这样每个
规则
的“type”都可以是不同的类,并且它的逻辑非常简单(最多只有几行)。最后,我在想,也许不同类型的
规则
应该以某种方式使用组合来产生一种“行为”或一些能够完成实际工作的东西

总而言之,以下是我目前的想法:

  • Filter
    执行所有检查
    规则类型的工作,并相应地采取行动<代码>规则
    只是一个“哑”实体,用来保存一些字符串
  • 规则
    执行检查其自身类型以及对给定实体执行某些操作的所有工作。现在,
    规则
    实体有点“胖”,但它对
    过滤器
    隐藏了实现,并且
    过滤器
    不需要更改以添加新的
    规则
    类型
  • Rule
    使用继承来完成上述操作,实际上是相同的想法,但不再使用
    switch
    语句
  • 要么2。或3。但是
    Rule
    为每种类型实例化了一个不同的“行为”对象(不使用依赖注入似乎不好,但封装行为似乎是一个好的设计)
  • 联合收割机1。四,。因此,
    过滤器
    可以从
    规则
    中获得正确的行为(现在可以使用依赖项注入,类似于“行为”工厂)

  • 我想我越是考虑它,就越倾向于最后几个选项,但我不知道这方面的最佳实践。我相信这是一个比较常见的例子,所以我希望能得到一些关于采取哪个方向的信息。(很抱歉回答了这么长的问题,希望它足够完整)

    我从您在这里给出的解释中得到的是,您有三种不同的东西-
    规则
    过滤器
    规则处理
    。所以,我会把这三个分开

    规则
    将只是定义过滤器行为的工具

    过滤器
    将加载规则和其他您想要执行的检查

    并将分别保留
    规则处理
    ,这将采用
    $entity
    $Rule
    并返回处理结果。那么你会得到这样的结果:

    public function filter($entity)
    {
        foreach ($this->rules as $rule) {
            RuleProcessing->processRule($entity, $rule);
        }
    }
    

    (如果我的理解不正确,请告诉我。)

    如果没有更多关于您正在处理的领域的信息,就很难给出任何答案。你能告诉观众更多关于你试图解决的实际问题吗?