【问题标题】:How to use a repository not linked to an entity in Symfony 4?如何使用未链接到 Symfony 4 中实体的存储库?
【发布时间】:2020-07-08 12:04:59
【问题描述】:

我有一个自定义存储库返回不适合实体的原始数据。

namespace App\Repository;

class RevenuesRepository
{
    /**
     * @return array Raw data about revenues
     */
    public function getRevenuesRecap()
    {
        // ...
        return $result;
    }
}

我想在控制器中使用它,但我不能使用$em->getRepository(...),因为这个存储库没有链接到实体。我该怎么做?

【问题讨论】:

  • 存储库可以提供返回原始数据的函数。拥有一个额外的存储库可能仍然会带来一些好处。同样在 symfony 4 和 5 中,您可以使用依赖注入/自动连接来获取存储库,方法是将其添加到控制器的 __construct 或操作方法参数中,恕我直言,方式更清洁,然后使用容器(不赞成)
  • 我不想创建一个空实体只是为了让我的存储库正常工作,这可能吗?如果是这样,我该怎么做?
  • 我不知道你的熟练程度,因为我回答了你的问题两次。学说 ORM 中的实体管理器显然是处理实体的。添加与实体无关的内容在语义上是错误的。从它请求一个与实体无关的存储库在语义上是错误的。另外,您已经找到了一种使它起作用的方法,我在答案中添加了另一种使它起作用的方法……因此,如果这不是语义上的错误,我真的不明白您要达到的目标。

标签: php symfony repository symfony4 repository-pattern


【解决方案1】:

如果您想在控制器函数中使用独立的自定义存储库,将其添加到操作方法签名或构造函数签名中就足够了:

use App\Repository\RevenuesRepository;

class RevenuesController {

    private $revenuesRepository;

    // inject it in constructor
    public __construct(RevenuesRepository $revenuesRepository) {
        $this->revenuesRepository = $revenuesRepository;
    }

    // OR (!) inject it in action
    public function getRevenuesRecapAction(RevenuesRepository $revenuesRepository) {
        $recap = $revenuesRepository->getRevenuesRecap();

        $response->setContent(json_encode([
            'data' => $recap,
        ]));

        $response->headers->set('Content-Type', 'application/json');

        return $response;
    }
}

这样,例如在测试时,可以清楚地看到依赖项是什么,以及您可能需要模拟或提供什么。此外,它还为您的 IDE 提供用于静态分析和代码完成的直接数据以及方法签名等更多有用信息。

这是由于自动接线而起作用的。在 symfony 4 和 5 中,存储库默认是服务,因此可以自动连接和准自动注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多