gpt4 book ai didi

architecture - Symfony2 Doctrine2 过滤器和规则的适当实体设计

转载 作者:行者123 更新时间:2023-12-04 23:52:06 26 4
gpt4 key购买 nike

所以我想做以下事情,我真的只是在寻找关于如何设计它的建议。

  • 我有可以在某些实体类型上运行的过滤器
  • 过滤器规则来定义它们的行为
  • Filter进程实体,使用它们的规则,并返回一个 bool 值
  • 作为一个具体的例子,我可能想过滤表明给定字段上的某些正则表达式被拒绝,我可以为它定义规则。我还可以有不同的规则,在同一个过滤器中使用简单的前缀匹配。

所以我想出了以下内容

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

将从数据库中加载规则并实现过滤器。

所以最初我想有一个像这样的实体

过滤规则:

  • scope(枚举类型定义哪个过滤器使用它)
  • 类型(可以有不同类型的规则,比如我提到的正则表达式和前缀)
  • 值(字符串,取决于规则的类型)

ImageFilter 将加载 FilterRule,其中范围设置为某个常量。然后 ImageFilter 将执行检查过滤器类型并将其一个接一个地应用于实体的繁重工作。以下伪代码演示了这一点。

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

但后来我想,实体是否应该负责上面的switch block ?所以它会变成这样:

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

这对我来说似乎更清晰,Filter 不关心新规则以及如何处理它们,只要“范围”是正确的。 但我的印象是实体应该是简单的 POPO 所以看起来拥有这种逻辑是一个糟糕的模式(但我从来没有 100% 确定一个实体应该做多少)。

我也考虑过使用 Inheritance Mapping所以每个 Rule“类型”都可以是不同的类,而且它的逻辑非常简单(最多只有几行)。最后,我在想也许不同类型的 Rule 应该以某种方式使用组合来产生“行为”或可以完成实际工作的东西......

总结一下,这是我目前的想法:

  1. Filter 完成所有工作,检查 Rule 的类型并采取相应的行动。 Rule 只是一个保存一些字符串的“哑”实体
  2. Rule 完成检查其自身类型和对给定实体执行某些操作的所有工作。现在 Rule 实体有点“胖”但是它隐藏了 Filter 的实现并且 Filter 不需要更改以添加新的规则类型
  3. Rule 使用继承来完成上述操作,实际上是相同的想法,但没有更多的 switch 语句
  4. 要么是 2. 要么是 3. 但 Rule 为每种类型实例化一个不同的“行为”对象(不真正使用依赖注入(inject)似乎很糟糕,封装行为似乎是一个不错的设计)
  5. 结合 1. 和 4. 这样 Filter 就可以从 Rule 获得正确的行为(现在可以像“行为”工厂一样使用依赖注入(inject))<

我想我越想越倾向于最后几个选项,但我不知道这方面的最佳实践。我确信这是一个相对常见的示例,因此我希望就应该采取的方向获得一些意见。 (很抱歉这么长的问题,希望它足够完整来回答)

最佳答案

我从您在此处给出的解释中得到的是,您拥有三个不同的东西 - RulesFiltersRuleProcessing。所以,我会把这三个分开。

Rules 将只是定义过滤器的行为。

Filters 将加载规则和您想要执行的其他检查。

并将Rule Processing分开保存,这将采用$entity$rule并返回处理后的结果。那么你会得到这样的东西:

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

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

关于architecture - Symfony2 Doctrine2 过滤器和规则的适当实体设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10357735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com