laravolt / camunda
高级模型,类似于Eloquent,通过REST API与Camunda资源交互
Requires
- php: >=8.0
- ext-simplexml: *
- guzzlehttp/guzzle: ^7.2
- spatie/data-transfer-object: ^3.6.1
Requires (Dev)
- brianium/paratest: ^6.2
- friendsofphp/php-cs-fixer: v3.0.0-rc.1
- orchestra/testbench: ^6.11
- sempro/phpunit-pretty-print: ^1.4
README
方便的Laravel HTTP客户端包装器,用于与Camunda REST API交互。
安装
composer require laravolt/camunda
配置
准备你的.env
CAMUNDA_URL=http://localhost:8080/engine-rest #optional CAMUNDA_TENANT_ID= CAMUNDA_USER= CAMUNDA_PASSWORD=
将以下条目添加到config/services.php
'camunda' => [ 'url' => env('CAMUNDA_URL', 'https://localhost:8080/engine-rest'), 'user' => env('CAMUNDA_USER', 'demo'), 'password' => env('CAMUNDA_PASSWORD', 'demo'), 'tenant_id' => env('CAMUNDA_TENANT_ID', ''), ],
使用方法
流程定义
use Laravolt\Camunda\Http\ProcessDefinitionClient; $variables = ['title' => ['value' => 'Sample Title', 'type' => 'string']]; // Start new process instance $instance = ProcessDefinitionClient::start(key: 'process_1', variables: $variables); // Start new process instance with some business key $instance = ProcessDefinitionClient::start(key: 'process_1', variables: $variables, businessKey: 'somekey'); // Get BPMN definition in XML format ProcessDefinitionClient::xml(key: 'process_1'); ProcessDefinitionClient::xml(id: 'process_1:xxxx'); // Get all definition ProcessDefinitionClient::get(); // Get definitions based on some parameters $params = ['latestVersion' => true]; ProcessDefinitionClient::get($params);
Camunda API参考:[https://docs.camunda.org/manual/latest/reference/rest/process-definition/](https://docs.camunda.org/manual/latest/reference/rest/process-definition/)
流程实例
use Laravolt\Camunda\Http\ProcessInstanceClient; // Find by ID $processInstance = ProcessInstanceClient::find(id: 'some-id'); // Get all instances ProcessInstanceClient::get(); // Get instances based on some parameters $params = ['businessKeyLike' => 'somekey']; ProcessInstanceClient::get($params); ProcessInstanceClient::variables(id: 'some-id'); ProcessInstanceClient::delete(id: 'some-id');
Camunda API参考:[https://docs.camunda.org/manual/latest/reference/rest/process-instance/](https://docs.camunda.org/manual/latest/reference/rest/process-instance/)
消息事件
use Laravolt\Camunda\Http\MessageEventClient; // Start processinstance with message event // Required // messageName : message event name // businessKey : Busniess key for process instance // Rerturn Process insntance from message event MessageEventClient::start(messageName: "testing", businessKey: "businessKey")
任务
use Laravolt\Camunda\Http\TaskClient; $task = TaskClient::find(id: 'task-id'); $tasks = TaskClient::getByProcessInstanceId(id: 'process-instance-id'); $tasks = TaskClient::getByProcessInstanceIds(ids: 'arrayof-process-instance-ids'); TaskClient::submit(id: 'task-id', variables: ['name' => ['value' => 'Foo', 'type' => 'String']]); // will return true or false $variables = TaskClient::submitAndReturnVariables(id: 'task-id', variables: ['name' => ['value' => 'Foo', 'type' => 'String']]) // will return array of variable // Claim a Task $tasks = TaskClient::claim($task_id, $user_id); // Unclaim a Task $tasks = TaskClient::unclaim($task_id); // Assign a Task $tasks = TaskClient::assign($task_id, $user_id);
Camunda API参考:[https://docs.camunda.org/manual/latest/reference/rest/task/](https://docs.camunda.org/manual/latest/reference/rest/task/)
外部任务
use Laravolt\Camunda\Http\ExternalTaskClient; $topics = [ ['topicName' => 'pdf', 'lockDuration' => 600_000] ]; $externalTasks = ExternalTaskClient::fetchAndLock('worker1', $topics); foreach ($externalTasks as $externalTask) { // do something with $externalTask // Mark as complete after finished ExternalTaskClient::complete($externalTasks->id); } // Unlock some task ExternalTaskClient::unlock($task->id) // Get task locked $externalTaskLocked = ExternalTaskClient::getTaskLocked();
Camunda API参考:[https://docs.camunda.org/manual/latest/reference/rest/external-task/](https://docs.camunda.org/manual/latest/reference/rest/external-task/)
消费外部任务
通过php artisan make:job <JobName>
创建一个新的作业以消费外部任务,并修改骨架
use Laravolt\Camunda\Dto\ExternalTask; use Laravolt\Camunda\Http\ExternalTaskClient; public function __construct( public string $workerId, public ExternalTask $task ) { } public function handle() { // Do something with $this->task, e.g: get the variables and generate PDF $variables = \Laravolt\Camunda\Http\ProcessInstanceClient::variables($this->task->processDefinitionId); // PdfService::generate() // Complete the task $status = ExternalTaskClient::complete($this->task->id, $this->workerId); }
订阅某个主题
// AppServiceProvider.php use Laravolt\Camunda\Http\ExternalTaskClient; public function boot() { ExternalTaskClient::subscribe('pdf', GeneratePdf::class); }
注册调度器
// app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command('camunda:consume-external-task --workerId=worker1')->everyMinute(); }
如果您需要更短的轮询时间(低于分钟频率),请查看Laravel Short Schedule。
参考
- [https://laravel.net.cn/docs/master/scheduling](https://laravel.net.cn/docs/master/scheduling)
- [https://laravel.net.cn/docs/master/queues](https://laravel.net.cn/docs/master/queues)
- [https://github.com/spatie/laravel-short-schedule](https://github.com/spatie/laravel-short-schedule)
任务历史(已完成任务)
use Laravolt\Camunda\Http\TaskHistoryClient; $completedTask = TaskHistoryClient::find(id: 'task-id'); $completedTasks = TaskHistoryClient::getByProcessInstanceId(id: 'process-instance-id');
Camunda API参考:[https://docs.camunda.org/manual/latest/reference/rest/history/task/](https://docs.camunda.org/manual/latest/reference/rest/history/task/)
部署
use Laravolt\Camunda\Http\DeploymentClient; // Deploy bpmn file(s) DeploymentClient::create('test-deploy', '/path/to/file.bpmn'); DeploymentClient::create('test-deploy', ['/path/to/file1.bpmn', '/path/to/file2.bpmn']); // Get deployment list DeploymentClient::get(); // Find detailed info about some deployment DeploymentClient::find($id); // Truncate (delete all) deployments $cascade = true; DeploymentClient::truncate($cascade); // Delete single deployment DeploymentClient::delete(id: 'test-deploy', cascade: $cascade);
原始端点
您可以使用Laravolt\Camunda\CamundaClient
来调用任何Camunda REST端点。
use Laravolt\Camunda\CamundaClient; $response = CamundaClient::make()->get('version'); echo $response->status(); // 200 echo $response->object(); // sdtClass echo $response->json(); // array, something like ["version" => "7.14.0"]
CamundaClient::make()
是Laravel HTTP客户端的包装器,其基础URL已根据您的Camunda服务配置设置。请参阅文档以获取更多信息。