规则-高级用法

2020-11-05  by  

架构定义

对于规则的干预,高级运用。

定义新规则(重写规则)

创建新的规则,如果创建的规则和字段规则重名,就可以覆写字段规则的执行条件和执行内容。

  1. 书写位置

    在生成的Repository文件中,包含了两个基本方法。

    class UserRepository extends AbstractServiceEntityRepository
    {
        public function __construct(ManagerRegistry $registry)
        {
            parent::__construct($registry, User::class);
        }
       
        public function registerRules()
        {
            // TODO: Implement registerRules() method.
        }
       
        public function ruleRewrite(Rule $currentRule, Rules $rules, ResultSetMappingBuilder $resultSetMappingBuilder)
        {
            // TODO: Implement ruleRewrite() method.
        }
    }
    
  2. 规则定义

    registerRules方法中注册规则

    public function registerRules()
    {
        $this->registerCoverRule('keyword', '关键词搜索');
    }
    

    说明

    (1) keyword就是规则名,他不需要在前面加上别名。

    (2) 如果我们需要对字段规则重写的话,以 idLIKE规则举例子,规则名为

    "id" .Rule::RA_LIKE
    
  3. 执行内容定义

    ruleRewrite中方法中对其进行实现

     public function ruleRewrite(Rule $currentRule, Rules $rules, ResultSetMappingBuilder $resultSetMappingBuilder)
     {
         if($this->ruleMatch($currentRule, 'keyword') && !Validate::isRealEmpty($currentRule->getValue())){
             $this->sqlArray['where'] .= " AND (sql_pre.name LIKE '%{$currentRule->getValue()}%' OR sql_pre.phone LIKE '%{$currentRule->getValue()}%') ";
         }
     }
    

    说明

    (1) ruleMatch方法用来判断规则是否匹配。

    (2) isRealEmpty方法是用来判断规则是否符合执行条件,这个判断并不是必须的。

    (3) 在执行体中,不光可以在sql_array数组各部分进行变更,也可以调用其他的规则,从而产生传导效果。

    (4) 规则值可以是已知的任意格式,对于复杂格式,应当在定义处进行注释说明。

    (5) 在执行体中我们如果需要重写在字段Sql的话,需要使用通过

    $this->registerRewriteSql('id', '(1 + 1)')
    

    实现。

    注意

    每个执行体必须包在规则判断中,否则会出现反复执行的问题。

  4. 规则定义规范

    (1) 规则和执行目的应当清晰,可以轻松的进行组合。

    (2) 规则调用应当足够的简单,应当可以相互触发,减少心智压力。

    (3) 规则一旦被使用,不要轻易的变更,因为其影响很大。

    (4) 不要轻易的定义新的规则,对规则要有架构的意识。

必要规则

必要规则指的是查询这张表就必须执行的规则。

例如查询A表就必须连结b表,查询A表就必须增加某些条件等等。

  1. 使用方法

    在生成的Repository文件中,找到registerRules方法。

    public function registerRules()
    {
        //注册必要规则
        $this->registerNecessaryRule(new Rule('id', 12));
    }
    

规则碰撞

规则在多层传递中,就会出现规则重复调用的情况。这种情形就称为规则冲突,需要碰撞处理。

使用

use PHPZlc\PHPZlc\Doctrine\ORM\Rule\Rules;
use PHPZlc\PHPZlc\Doctrine\ORM\Rule\Rule;

$rules = new Rules(
    [
        new Rule(new Rule('id', $id))
    ]
);

$rules
    ->addRule(new Rule('id', $id))
    ->addRule(new Rule('name', $name));

上面的代码中我们将原来简单的数组转换为对象。规则碰撞的控制是由Rule对象的其他属性进行控制的。

下面我们将详细说明Rule的初始化方法。

public function __construct($name, $value ,$collision = null, $jointClass = null, $jointSort = null)

解析:

  1. name

    规则名

  2. value

    规则值

  3. collision

    碰撞规则

     Rule::REPLACE 取代  //如果底层出现相同规则,则忽略底层规则
        
     Rule::FORGO 放弃  //如果底层出现相同规则,则使用底层规则
        
     Rule::JOINT 联合  //如果底层出现相同规则,则将规则值拼接或连结
    
  4. jointClass

    联合执行类,当碰撞规则为Rule::JOINT时有效。

    默认类,对字符串进行拼接。

     new \PHPZlc\PHPZlc\Doctrine\ORM\Rule\Joint\StringJoint(); 
    

    可以通过实现接口自定义执行类。

    PHPZlc\PHPZlc\Doctrine\ORM\Rule\InterfaceJoint
    
  5. jointSort

    联合执行优先顺序,当碰撞规则为Rule::JOINT时有效。

    默认值: Rule::ASC

    Rule::ASC // 正序  (上一级排在前面)
        
    Rule::DESC// 倒序 (当前级排在前面)
    

书写复杂SQL和聚合查询的使用方法

前往了解原理,学习方法

找到错别字了?本文档有什么问题么?分叉并编辑 它 !

CJayhe

谢谢您的赞赏~

使用微信扫描二维码完成支付

抱歉弹框打扰,系统检测到您今日累计浏览时长已达120秒。如果我们的项目对您有帮助,在 关闭窗口之前,希望能够阅读弹框内容,帮助我们变得更好。

一个成功的项目,实现功能只是基础,合理的架构,对资源的调度能力才是灵魂。 PHPZlc, 致力于在Symfony的基础上提供“知行合一”的项目开发方案。

如果您有关切问题和好的想法:

提交

如果您想帮助我们,可以为我们点亮星星,也可以提供资金支持。

您还可以通过以下渠道,关注我们,获取最新的框架动态,帮助项目获取人气,扩大影响力。

开源伙伴招募:https://phpzlc.com/blog/11.html

由于我们无法获取您是否已经是我们的会员了,所以此弹框每日都会弹出一次,关闭