asseco-voice/laravel-plan-router

Laravel计划路由支持。

v6.1.1 2024-02-15 14:05 UTC

README

Laravel计划路由

此包是inbox包的扩展。其主要目的是提供定义多个具有特定正则规则的计划的能力,并输入某些输入后返回匹配的计划

例如,您可能有一个匹配*@gmail地址的计划,另一个匹配*@yahoo.com地址的计划。提供输入后,包将返回第一个或第二个计划,具体取决于实际提供的地址。

安装

通过composer安装包。它将自动注册为Laravel服务提供者,因此无需采取任何额外操作。

composer require asseco-voice/laravel-plan-router

术语

规则

用于匹配正则的表达式。

示例:

  • 对于电子邮件,这可以是:from, to, cc, bcc, subject
  • 对于短信,这可以是:from, to, body

计划

一组必须匹配的正则表达式的用户友好名称,以便使该计划生效。计划规则之间存在多对多关系,您可以在枢纽表中定义实际的正则表达式。

例如。

Plan 1 -> from     *@gmail.com
       -> subject  *VIP*

Plan 2 -> from     *@yahoo.com

priority如果同时命中两个计划,则优先级较高的计划具有更高的优先级,并且如果命中,则不会命中其他可能匹配的回调。

match_either - 作为OR/AND门的功能。如果设置为true,则定义多个匹配项,只需匹配其中一个即可使计划生效。如果设置为false,则需要匹配所有匹配项才能使该特定计划生效。

设置

要设置包

  1. 运行artisan migrate迁移
  2. 运行(或在您的DatabaseSeeder中包含)PlanRouterPackageSeeder以生成示例数据。对于生产,仅运行RuleSeeder,因为它是包运行所必需的。它定义了您的原始有效负载可以匹配的内容。
  3. 对于任何自定义要求,请提供自己的RuleSeeder而不是包中的。

用法

在您计划接收消息的地方调用InboxService::match()。该函数接受单个参数,该参数是实现CanMatch接口的类,因此请确保分配一个将解析您的原始输入并将其传递到方法的类。

CanMatch实现的详细信息可以在原始包文档中查看。如果匹配成功,将返回匹配的计划,如果没有匹配,则返回null

示例

public function __invoke(ReceiveEmailRequest $request)
{
    // email() is some arbitrary method in form request 
    // returning a CanMatch instance from given request data.
    $canMatchInstance = $request->email(); 

    $matchedPlan = InboxService::match($canMatchInstance);

    return response('success');
}

计划 - 模型值

您可以为每个计划提供一组attribute => value值,这将负责更改已保存模型的属性(检查plan_model_values表)。模型必须使用HasPlanValues特质。

例如,有一个具有属性titledescriptionMessage模型,以及以下值的两个计划

ID  plan_id attribute       value

1   1       title           New title
2   2       description     Modify this

这意味着计划1将修改标题,而计划2将修改描述。

现在,当发生命中时,您可以将这些修改应用到上面。

$message = Message::create([
    'title'         => 'some title',
    'description'   => 'some description',
]);

// Let's say Plan 2 was hit
$matchedPlan = InboxService::match($canMatchInstance);

$message->applyPlanValues($matchedPlan);

dd(
    $message->title,      // Will dump "some title" as Plan 2 doesn't have title in plan_model_values.
    $message->description // Will dump "Modify this" because of Plan 2 hit. 
);

您还可以将数据库中的 属性 设置为关系名称。前提是这个名称在模型上存在一个关系。在这种情况下,将更新关系而不是实际的模型属性。

例如,如果 Message 属于 Folder,并且有一个 folder(): BelongsTo 方法,您可以这样定义 Plan 模型的值

ID  plan_id attribute       value

1   1       folder          1

扩展包

发布配置将允许您更改包模型,以及控制迁移的行为。如果扩展模型,请确保在实现中扩展原始模型。