albertborsos / yii2-ddd
使用 Yii 2.0 框架进行领域驱动开发的类
1.0.1
2019-06-21 13:41 UTC
Requires
- php: >=7.1.0
- yiisoft/yii2: ~2.0.0
Requires (Dev)
- codeception/base: ~3.0
- codeception/mockery-module: ^0.3.0
- codeception/specify: ~1.0
- codeception/verify: ~1.0
- mito/yii2-coding-standards: ~2.0.0@beta
- satooshi/php-coveralls: ^2.1
This package is auto-updated.
Last update: 2024-08-29 15:10:04 UTC
README
Yii 2.0 的 DDD 类
使用 Yii 2.0 框架实现的领域驱动设计类
安装
通过 composer 安装此扩展是首选方法。
运行
php composer.phar require --prefer-dist albertborsos/yii2-ddd
到你的 composer.json
文件的 require 部分中。
使用方法
让我们通过一个标准的 App
模型来看一个例子,该模型实现了 \yii\db\ActiveRecord
,并通过 gii
生成。我建议不要对这个类进行任何修改,而是将其设置为 abstract
以防止直接使用。
然后创建一个业务模型,它扩展了我们的抽象活动记录类并实现了 BusinessObject
接口。所有的业务逻辑都将在这个类中实现。
<?php namespace application\domains\app\business; use application\domains\app\activerecords\AbstractApp; use albertborsos\ddd\interfaces\BusinessObject; class App extends AbstractApp implements BusinessObject { // business logic }
让我们创建一个新的记录!
我们需要一个新的 FormObject
,它将负责数据验证。我们还需要一个 service
模型,该模型处理与相关模型相关的业务逻辑。
FormObject
的简单示例
<?php namespace application\services\app\forms; use yii\base\Model; use albertborsos\ddd\interfaces\FormObject; class CreateAppForm extends Model implements FormObject { public $name; public $languages; public function rules() { return [ [['name', 'languages'], 'required'], [['languages'], 'each', 'rule' => ['in', 'range' => ['en', 'de', 'hu']]], ]; } }
service
的简单示例。服务期望 FormObject
中的值是有效的值。这就是为什么它只是存储值。验证将在控制器中处理。
<?php namespace application\services\app; use albertborsos\ddd\models\AbstractService; use application\services\app\forms\CreateAppLanguageForm; use application\domains\app\business\App; use yii\base\Exception; class CreateAppService extends AbstractService { /** * Business logic to store data for multiple resources. * * @return mixed */ public function execute() { try { $model = new App(); $model->load($this->getForm()->attributes, ''); if ($model->save()) { $this->assignLanguages($model->id, $this->getForm()->languages); $this->setId($model->id); return true; } } catch(\yii\db\Exception $e) { $this->getForm()->addErrors(['exception' => $e->getMessage()]); } return false; } private function assignLanguages($appId, $languageIds) { foreach ($languageIds as $languageId) { $form = new CreateAppLanguageForm([ 'app_id' => $appId, 'language_id' => $languageId, ]); if ($form->validate() === false) { throw new Exception('Unable to validate language for this app'); } $service = new CreateAppLanguageService($form); if ($service->execute() === false) { throw new Exception('Unable to save language for this app'); } } } }
这就是您如何在控制器中使用它的方法
<?php namespace application\controllers; use Yii; use application\services\app\forms\CreateAppForm; use application\services\app\CreateAppService; class AppController extends \yii\web\Controller { public function actionCreate() { $form = new CreateAppForm(); if ($form->load(Yii::$app->request->post()) && $form->validate()) { $service = new CreateAppService($form); if ($service->execute()) { AlertWidget::addSuccess('App created successfully!'); return $this->redirect(['view', 'id' => $service->getId()]); } } return $this->render('create', [ 'model' => $form, ]); } }