一:环境配置
开发环境:lnmp
开发框架:Yii2.0
二:目的
1.实现业务流程的清晰化
2.实现功能的高可复用性
3.实现业务的高可扩展性
4.可在web app,console app, api等形式中自由迁移
三:实现思路
1.针对不同的业务流程,定制不同的服务;
2.服务是由组件组合而成,单个组件有一个选择器,用于选择组件的不同功能,选择器会内置几个通用型,还可以自定义实现,从而保证功能变化的灵活性;
3.服务会注册一个数据适配器,用于适配不同的数据来源,保证功能组件获取数据的统一,从而达到功能组件复用目的;
4.服务会注册一个交互适配器,用于适配不同的交互方式,保证交互方式的灵活性。
四:UML类图
//下面是实现的部分代码实例
class TestOneController extends BaseController
{
public function actionCreate()
{
$dataAdapter = new DataAdapter();//未实现
$createOrderService = \Yii::$app->get('create-order');
$createOrderService->setDataAdapter($dataAdapter);//未实现
$createOrderService->setOrderComponents(
[
'save-test-one' => [
'class' => 'app\services\order\components\SaveTestOne',
'selector' => 'app\services\order\selectors\GeoSelector',
]
]
);
$createOrderService->setInteraction([
'save-test-one' => function () {
return 'error';
},
'success' => function () {
return 'success';
}
]);
return $createOrderService->run();
}
}
1.服务实现
abstract class AbstractOrderService extends ServiceLocator
{
protected $orderComponentList = [];
public function run()
{
try {
foreach ($this->orderComponentList as $each) {
$object = $this->get($each);
$object->execute();
}
} catch(Exception $e) {
throw new Exception($e->getMessage());
}
}
public function setOrderComponent($id, $definition)
{
array_push($this->orderComponentList, $id);
$this->set($id, $definition);
}
public function setOrderComponents($components)
{
foreach ($components as $id => $component) {
$this->setOrderComponent($id, $component);
}
}
}
class CreateOrderService extends AbstractOrderService
{
}
2.功能组件实现
abstract class AbstractComponent extends Component
{
public $selector = null;
final public function execute()
{
if (!is_null($this->selector) && is_callable($this->selector, true)) {
$selector = Yii::createObject([
'class' => $this->selector,
'component' => $this,
]);
$className = $selector->execute();
$object = Yii::createObject($className);
return $object->run();
} else {
return $this->run();
}
}
abstract public function run();
}
class SaveTestOne extends AbstractComponent
{
public function run()
{
var_dump('abcdefg!');
}
}
class BrSaveTestOne extends AbstractComponent
{
public function run()
{
var_dump('BrSaveTestOne');
}
}
3.选择器实现
abstract class AbstractSelector extends Component
{
public $component;
abstract public function execute();
}
class GeoSelector extends AbstractSelector
{
public function execute()
{
return 'app\services\order\components\BrSaveTestOne';
}
}
4.数据适配器实现
未完成
5.交互适配器实现
未完成
以上是比较简陋的思路体现,语言表达有不近如意之处,还请勿怪!