上一篇文章https://blog.csdn.net/u011115903/article/details/100763399讲到我们面临的核心问题就是如何调用引擎触发启动事件,任务流转,结束事件,以及如何获取要持久化的数据,接下来我们会在此篇文章内详细讲解这一大家最关心的问题。
按照上一篇实现方式的方案,我们需要ProcessMaker\Nayra引擎帮助我们完成两个核心方法:启动流程,任务流转。
在我们要调用引擎的方法时,要准备好他要创建的实例,而创建实例则需要首先完成引擎指定的几个Interface,这些Interface有各自不同的作用,我们可以根据自己的需求在实现Interface时的指定方法时自定义。下面我把要需要实现的inteface的代码提供给大家,其中需要自定义的方法我会单独列给大家。
实现ProcessMaker\Nayra\Contracts\Engine\EngineInterface
这是核心接口,它的ProcessMaker\Nayra\Engine\EngineTrait中给出了核心方法,如流转方法 runToNextState,创建实例方法createExecutionInstance,从已有数据中加载实例方法loadExecutionInstance
<?php
namespace app\engine;
use ProcessMaker\Nayra\Contracts\Engine\EngineInterface;
use ProcessMaker\Nayra\Contracts\Engine\EventDefinitionBusInterface;
use ProcessMaker\Nayra\Contracts\Engine\JobManagerInterface;
use ProcessMaker\Nayra\Contracts\EventBusInterface;
use ProcessMaker\Nayra\Contracts\RepositoryInterface;
use ProcessMaker\Nayra\Engine\EngineTrait;
/**
* Test implementation for EngineInterface.
*
* @package ProcessMaker\Bpmn
*/
class BpmnEngine implements EngineInterface {
use EngineTrait;
/**
* @var RepositoryInterface
*/
private $repository;
/**
* @var EventBusInterface $dispatcher
*/
protected $dispatcher;
/**
* Test engine constructor.
*
* @param \ProcessMaker\Nayra\Contracts\RepositoryInterface $repository
* @param \ProcessMaker\Nayra\Contracts\EventBusInterface $dispatcher
* @param \ProcessMaker\Nayra\Contracts\Engine\JobManagerInterface|null $jobManager
* @param \ProcessMaker\Nayra\Contracts\Engine\EventDefinitionBusInterface|null $eventDefinitionBus
*/
public function __construct(RepositoryInterface $repository, EventBusInterface $dispatcher, JobManagerInterface $jobManager = null, EventDefinitionBusInterface $eventDefinitionBus = null)
{
$this->setRepository($repository);
$this->setDispatcher($dispatcher);
$this->setJobManager($jobManager);
$eventDefinitionBus ? $this->setEventDefinitionBus($eventDefinitionBus) : null;
}
/**
* @return EventBusInterface
*/
public function getDispatcher()
{
return $this->dispatcher;
}
/**
* @param EventBusInterface $dispatcher
*
* @return $this
*/
public function setDispatcher(EventBusInterface $dispatcher)
{
$this->dispatcher = $dispatcher;
return $this;
}
/**
* @return FactoryInterface
*/
public function getRepository()
{
return $this->repository;
}
/**
* @param RepositoryInterface $repository
*
* @return $this
*/
public function setRepository(RepositoryInterface $repository)
{
$this->repository = $repository;
return $this;
}
}
实现ProcessMaker\Nayra\Contracts\RepositoryInterface
这同样是一个核心接口,它的ProcessMaker\Nayra\RepositoryTrait主要提供了如何创建流程对象的方法,是创建最后操作实例的必要参数。
<?php
namespace app\engine;
use ProcessMaker\Nayra\Contracts\Repositories\StorageInterface;
use ProcessMaker\Nayra\Contracts\RepositoryInterface;
use ProcessMaker\Nayra\RepositoryTrait;
use ProcessMaker\Test\Models\CallActivity;
use ProcessMaker\Test\Models\ExecutionInstance;
use app\engine\FormalExpressionEngine;
use ProcessMaker\Test\Models\TestOneClassWithEmptyConstructor;
use ProcessMaker\Test\Models\TestTwoClassWithArgumentsConstructor;
use app\engine\ExecutionInstanceRepositoryEngine;
/**
* Repository
*
* @package ProcessMaker\Test\Models
*/
class RepositoryEngine implements RepositoryInterface {
use RepositoryTrait;
/**
* Create instance of FormalExpression.
*
* @return \ProcessMaker\Nayra\Contracts\Bpmn\FormalExpressionInterface
*/
public function createFormalExpression()
{
return new FormalExpressionEngine();
}
/**
* Create instance of CallActivity.
*
* @return \ProcessMaker\Nayra\Contracts\Bpmn\CallActivityInterface
*/
public function createCallActivity()
{
return new CallActivity();
}
/**
* Create a execution instance repository.
*
* @return \ProcessMaker\Test\Models\ExecutionInstanceRepository
*/
public function createExecutionInstanceRepository()
{
return new ExecutionInstanceRepositoryEngine();
}
/**
* Create a test class
*
* @return TestOneClassWithEmptyConstructor
*/
public function createTestOne()
{
return new TestOneClassWithEmptyConstructor();
}
/**
* Create a test class with parameters
*
* @param mixed $field1
* @param mixed $field2
*
* @return TestTwoClassWithArgumentsConstructor
*/
public function createTestTwo($field1, $field2)
{
return new TestTwoClassWithArgumentsConstructor($field1, $field2);
}
}
实现ProcessMaker\Nayra\Contracts\EventBusInterface
这个接口可以不实现具体方法(我就什么都没实现),他可能提供了对事件的监听,做消息通知使用(待确认,我没使用到)
<?php
namespace app\engine;
use ProcessMaker\Nayra\Contracts\EventBusInterface;
class EnventEngine implements EventBusInterface {
/**
* Register an event listener with the dispatcher.
*
* @param string|array $ev