如何使用未链接到 Symfony 4 中的实体的存储库?

How to use a repository not linked to an entity in Symfony 4?

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

namespace App\Repository;

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

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

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

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 中,默认情况下存储库是服务,因此可以自动连接和准自动注入。