Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 应用程序逻辑是否应该访问存储库?_Php_Domain Driven Design - Fatal编程技术网

Php 应用程序逻辑是否应该访问存储库?

Php 应用程序逻辑是否应该访问存储库?,php,domain-driven-design,Php,Domain Driven Design,考虑到DDD方法,我将一个类移动到一个公共文件夹中,因为它将在模块之间共享。问题是我不知道如何使用依赖项注入和容器 基本上,MenuService-generate方法创建了一个autogenerator实例,该实例从MenuRepository传递4个数组 MenuService.php namespace MP\Application\Services; use MP\Domain\Repositories\Repository; use MP\Application\Generation

考虑到DDD方法,我将一个类移动到一个公共文件夹中,因为它将在模块之间共享。问题是我不知道如何使用依赖项注入和容器

基本上,MenuService-generate方法创建了一个autogenerator实例,该实例从MenuRepository传递4个数组

MenuService.php

namespace MP\Application\Services;

use MP\Domain\Repositories\Repository;
use MP\Application\Generation\AutoGenerator;

class MenuService {

    private $repository;   

    public function __construct(Repository $repository){
        $this->repository = $repository;
    }

    public function generate(){
        // fetch/set $recipes, $menu, $settings;
        $generate = new AutoGenerator($recipesArr, $menuArr, $allIngredients);
    }
}
此处传递
$allIngredients
的唯一原因是因为AutoGenerator实例化了另一个名为Scaler的类,主要方法称为
scale($recipe,$percentage,$allIngredients)
,这是AutoGenerator类中唯一使用
$allIngredients
的地方

class AutoGenerator {
    public function add(...){
        $percentage = new Percentage(...); 
        $scaler = new Scaler();
        $try = $scaler->scale($recipe, $percentage, $this->allIngredients);

        if($try->isSuccess()){
            ...
        }
    }
}
我正试图用MenuService删除所有对自动生成器的依赖,最后是Scaler。。。基本上,我使用_invoke方法创建了一个名为components的类,该方法在构造函数中获取存储库,它在软件的早期被实例化,现在我将其注入构造函数中

问题是AutoGenerator现在无法实例化Scaler类,因为它具有构造函数依赖项,这意味着AutoGenerator类现在必须作为依赖项传递Scaler。。。这就引出了我下面的问题。。我应该在哪里传递$RecipeArr和$menuArr

我之所以这么问,是因为我不确定创建一个类只是为了返回一个数据库查询,这样我就可以在构造函数中传递它是否正确。$recipesArr/$AllingElements来自RecipeRepository,$menuArr来自MenuRepository

或者我应该只在scaler构造函数中注入RecipeRepository和MenuRepository吗

这是文件夹结构:

MP\Application\Generation\Common\Scaler;
MP\Application\Generation\AutoGenerator;

SHARED\Domain\Repositories\Ingredients;

MP\Domain\Repositories\RecipeRepository;
MP\Domain\Repositories\MenuRepository;

答案是:

应用程序服务应该关注读取和持久化。正确的使用方法是:

  • 根据一些输入(ID),您需要获得给定的域实体
  • 然后通过其他输入参数调用实体上的方法/属性,或者使用域服务传入域实体和新输入
  • 域服务(或对实体的调用)将对域实体进行更改。这些变化仍在记忆中
  • 因此,在最后,您将需要坚持这些更改

  • 我刚在谷歌上搜索了一下,想了解更多详情,请查看以下内容:

    在您的问题中,您描述了
    解决方案,并询问它有什么问题。相反,我将描述问题所在的领域,以及您试图实现的目标。然后有人可能会对模型是否好有意见。