引用类“Doctrine\ODM\MongoDB\UnitOfWork”,但不存在这样的服务

问题描述 投票:0回答:3

我目前正在使用 Symfony 4 和 Doctrine MongoDB Bundle,按照此链接中的说明进行操作: DoctrineMongoDBBundle。所以,我有一个用户文档:

src/Document/UserDocument.php

/** @MongoDB\Document(collection="user", repositoryClass="App\Repository\UserRepository") */
class UserDocument
{

    /**
     * @MongoDB\Id
     * @var ObjectId
     */
    private $id;

    /**
     * @MongoDB\Field(type="string", name="first_name")
     * @var string
     */
    private $firstName;

    /**
     * @MongoDB\Field(type="string", name="middle_name")
     * @var string
     */
    private $middleName;

    /**
     * @MongoDB\Field(type="string", name="last_name")
     * @var string
         */
        private $lastName;
    }

src/Repository/UserRepository.php

use Doctrine\ODM\MongoDB\DocumentRepository;
class UserRepository extends DocumentRepository
{

}

src/Controller/Content.php

内容类扩展控制器

{

    /**
     * @Route("/content", name="content")
     * @param UserRepository $user
     * @return Response
     */
    public function index(UserRepository $user)
    {
        $user->findAll();
        return new Response();
    }


}

因此,运行内容页面后,我收到以下错误:

无法自动装配服务“App\Repository\UserRepository”:方法“__construct()”的参数“$uow”引用类“Doctrine\ODM\MongoDB\UnitOfWork”,但不存在此类服务。

DocumentRepository 构造函数如下所示:

public function __construct(DocumentManager $dm, UnitOfWork $uow, ClassMetadata $classMetadata)
    {
        parent::__construct($dm, $uow, $classMetadata);
    }
symfony doctrine-mongodb
3个回答
8
投票

存储库不应该是服务,但如果您想保持这种状态,只需自动装配

DocumentManager
并从文档管理器获取 uow 和 classmetdata。

UnitOfWork
ClassMetadata
无法自动连接

在你的

UserRepository
中做类似的事情,它应该有效。

public function __construct(DocumentManager $dm)
{
    $uow = $dm->getUnitOfWork();
    $classMetaData = $dm->getClassMetadata(User::class);
    parent::__construct($dm, $uow, $classMetaData);
}

2
投票

确保从自动装配中排除您的存储库类。示例如下:https://symfony.com/doc/current/service_container/3.3-di-changes.html

如果您希望将存储库类作为服务,您应该使用工厂服务来完成。


0
投票

您可以使用

Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepository
代替
Doctrine\ODM\MongoDB\Repository\DocumentRepository

use Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepository;

class UserRepository extends ServiceDocumentRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, User::class);
    }
}

参见https://www.doctrine-project.org/projects/doctrine-mongodb-bundle/en/5.0/first_steps.html#service-repositories

© www.soinside.com 2019 - 2024. All rights reserved.