Laravel 架构 - 我应该把这个 class 放在哪里?

Laravel Architecture - Where do I put this class?

让我布景:

我有一个 "Item" class,里面有不同的食物(如胡萝卜、苹果等)。 这链接到 "items" table。这里一切都很好

在我从中迁移的旧框架中,我还有一个 "Complete Protein" class 在构造函数中需要一个 Item 对象。然后,此 "CompleteProtein" 对象将能够执行复杂的查询和方法,并包含有关 "Complete Protein" 是什么的一般信息。

这适合 Laravel 的什么地方?它看起来不像是一个 eloquent 模型,因为它不直接与数据库中的任何 table 相关, 但它确实进行数据库查询 .它确实有依赖注入(Item),以及class.

中的复杂方法和常量

我是否应该以某种方式使它们适合 "Item" class?感觉会比较乱

这是一项服务 class。无论您选择哪种框架,我都会这样命名。

有些人更喜欢名为 'Services' 的文件夹(和命名空间),其他人则更喜欢使用无声域驱动方法(也许将其保存在名为 'Protein' 的文件夹中?)但仅此而已给你。

你真的不需要 Eloquent 模型。我什至不使用 Eloquent(但绝对喜欢 Laravel 的其余部分)。我什至不使用 ORM(甚至不使用 Doctrine2)。但如果您仍然喜欢使用它,请将其视为您基础设施的一部分,而不是您业务领域的一部分。在 Repository methods 内部进行 Eloquent 调用,例如 findByEmail()save()。许多人将存储库作为一个接口,这样他们就可以交换服务提供商中的实现以进行测试(您使用内存存储库实现,可能只是将内容存储在数组中)。同样,我不会 return Eloquent 来自这些存储库的模型,而是 return 水合域对象。

您所描述的是您业务领域中的一个实体。这可能是您业务领域中的领域服务,但听起来更像是一个实体(在 DDD 中)。我会将该实体放在 class 中这样的位置:

app\
  Domain\
     CompleteProteins\
         CompleteProtein.php
         CompleteProteinRepository.php
     Items\
         Item.php
         ItemRepository.php
     (maybe some domain service classes here as well)
  Http\
  Queries\
  Helpers\
  Services\ (<-- maybe application level services here)
  etc...

现在在您的 CompleteProtein.php 中写一个具有您需要的属性的 class 并为其提供方法(因此它是 not anemic)以形成一个代表明确定义的实体 "thing" 在您的业务中。分离出 "collection" 类操作所需的方法。在这些操作中,您要么从数据库之类的东西中提取数据,要么持久保存到数据库之类的东西中。把这些特殊的方法分离出来放到Repository中。您的代码最终将如下所示:

$protein = new CompleteProtein($item, $blah, $blahblah);
$protein->doSomethingWith("Apples");
$proteinRepository->persist($protein);

这是编码和封装规则的好方法。新开发人员可以轻松查看构成您业务的所有 "things"。如果您的开发人员希望进行一些持久化,那么您可以指示 him/her 到 "go to the repository"。没有一次性查询在这里和那里!没有散​​落的 ORM 调用(假装你的关系数据库是面向对象的)!你也可以在你的域对象上有一个方法,比如 markAsDeleted(或者更好的是 markAsErroneous),这样当你用 ->persist 将它发送到存储库时,存储库可以在你的对象并知道删除它。这允许您向删除添加逻辑。研究使用 PHP 的反射 class 为存储库提供对 hydrate/dehydrate 域对象的访问的技术。 Zend 框架有一个很好的基础框架,我喜欢使用。存储库也适用于类似集合的大量计算。

(注意:我在上面列出了一个名为 Queries 的文件夹,供您为 READ 查询情况创建 classes。您不需要混合完整的实体在许多情况下,您只是想在整个应用程序的屏幕上显示信息。Google "Command Query Separation".)