仓库的目的是什么,当服务类可以做同样的事情时?

8 浏览
0 Comments

仓库的目的是什么,当服务类可以做同样的事情时?

通常情况下,我会将逻辑放在服务类中,而不使用仓储。例如,像下面这样:\n

namespace App\ProjectName\Profile;
use App\User;
class AccountService
{
    private $userModel;
    public function __construct(User $userModel)
    {
        $this->userModel = $userModel;
    }
    public function detail()
    {
        $user = \Auth::User();
        return [
            'id'    => $user->id,
            'name'  => $user->name,
            'email' => $user->email,
            'keys'  => $user->keys,
        ];
    }
    public function addKey($name, $key)
    {
        return $this->userModel->keys()->create([
            'name' => $name,
            'key'  => $key
        ]);
    }
}

\n我见过一些更进一步的示例,通过创建仓储类进行了重构。类似于`UserController`输入数据,将其发送给`UserCreatorService`,后者获取`UserRepository`,而`UserRepository`则获取`UserModel`。似乎`UserCreatorService`是`UserRepository`的重复?

0
0 Comments

在Laravel项目中,使用Repository模式的目的是为了与数据库进行交互。对于大规模的Laravel项目来说,使用Repository模式是必要的。举例来说,如果你决定将数据库从Mysql更换为CockroachDB,Laravel的Eloquent无法支持这个变化,因此你需要修改整个项目中与Eloquent相关的PHP代码。但是使用Repository模式,你不需要这样做。因为你只需要将Repository连接到Eloquent或直接连接到数据库,如果你想迁移到CockroachDB,你只需要在一个地方修改代码,而不需要修改应用程序的任何其他部分。

在Laravel中,Service类可以用于以下几个方面:

1 - 简化控制器

2 - 可重用的具有依赖性的代码

3 - 有些人使用Service类来发送curl请求到外部API。

你可以根据自己的喜好来使用Service类。

总结起来,使用Repository模式的原因是为了在改变数据库时能够更方便地修改相关的代码,并且避免在整个项目中修改大量的代码。而Service类可以用于简化控制器、实现可重用的代码以及发送curl请求到外部API。通过使用这两种设计模式,我们可以更好地组织和管理我们的代码。

0
0 Comments

领域驱动设计(DDD)中,存储库的责任是负责在指定的数据存储中加载、存储、修改和删除实体(这可能是一个数据库,也可能是远程服务器或文件)。而服务类则有非常狭窄的责任,执行一些有用的活动。每个服务类都是单独实例化的,然后注入到应用程序层或更高层中的代码中,起到桥接作用。这种方法被证明非常有优势,因为它允许管理本来无关的代码之间的依赖关系。

这两个定义和概念的起源表明它们实际上是非常不同的东西。你偶然注意到存储库和服务类有明显的重叠,但这是由于实现细节或错误使用造成的。它们的责任可能在某些情况下互相配合(导致协作),但它们确实是正交的概念。

此外,存储库应该出现在较深层(持久化或数据访问层)。而服务类通常是垂直交叉或出现在应用程序层。

通过适当的分层,存储库和服务类之间的差异变得更加明显。

不要将它们视为可以随意移动的纯代码工件。它们是明确定义的概念,有助于理解和设计系统的结构。它们只是作为设计的结果而转化为实际代码。

希望我在写这篇文章时能够解决一些概念上的困惑,而不会让人感到混乱。

0
0 Comments

在开发过程中,我们经常会遇到这样的问题:当服务类可以完成相同的工作时,仓库的目的是什么?本文将探讨这个问题的出现原因以及解决方法。

根据项目的复杂性和需求,对于你的问题并没有一个确定的答案。然而,服务类和仓库是两个不同的概念。仓库是模型的一个常见封装,用于编写与数据库交互的查询语句。在我看来,仓库不应该添加逻辑,其唯一目的是从数据库中获取或存储数据。使用仓库的好处在于可以比较容易地切换到其他数据库系统。

而服务类则是用来添加应用程序的逻辑。它是应用程序的核心,负责处理业务逻辑和数据处理等操作。

关于这个问题的更多信息,你可以参考上面提供的链接。

至于你的问题,关于在AccountService类中使用PHPUnit,是可以的。根据你提供的代码,实现起来也很简单。不过,你需要删除$user = \Auth::User();这行代码,并在类中添加一个私有变量,在构造函数中进行赋值。这样,在PHPUnit测试中(或者[codeception]中),你可以使用Mockery来传递一个User实例。

希望对你有所帮助!

0