asseco-voice / laravel-plan-router
Laravel计划路由支持。
Requires
- php: ^8.1
- asseco-voice/laravel-common: ^3.0
- asseco-voice/laravel-inbox: ^3.0
- laravel/framework: ^10.0
Requires (Dev)
- doctrine/dbal: ^3.0
- fakerphp/faker: ^1.9.1
- mockery/mockery: ^1.4.4
- orchestra/testbench: ^8.5
- phpunit/phpunit: ^10.0
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
,则需要匹配所有匹配项才能使该特定计划生效。
设置
要设置包
- 运行
artisan migrate
迁移 - 运行(或在您的
DatabaseSeeder
中包含)PlanRouterPackageSeeder
以生成示例数据。对于生产,仅运行RuleSeeder
,因为它是包运行所必需的。它定义了您的原始有效负载可以匹配的内容。 - 对于任何自定义要求,请提供自己的
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
特质。
例如,有一个具有属性title
和description
的Message
模型,以及以下值的两个计划
:
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
扩展包
发布配置将允许您更改包模型,以及控制迁移的行为。如果扩展模型,请确保在实现中扩展原始模型。