0

我目前正在使用带有 Doctrine MongoDB Bundle 的 Symfony 4,遵循此链接中的说明: 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);
    }
4

2 回答 2

5

Repository shouldn't be Services, but if you want to keep it that way, just Autowire the DocumentManager and get the uow and classmetdata from the Document Manager.

UnitOfWork and ClassMetadata can't be autowired

Do something like that in your UserRepository, it should work.

public function __construct(DocumentManager $dm)
{
    $uow = $dm->getUnitOfWork();
    $classMetaData = $dm->getClassMetadata(User::class);
    parent::__construct($dm, $uow, $classMetaData);
}
于 2018-12-07T09:13:21.977 回答
1

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

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

于 2018-05-09T03:17:52.197 回答