简体   繁体   English

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

[英]references class “Doctrine\ODM\MongoDB\UnitOfWork” but no such service exists

I'm currently using Symfony 4 with Doctrine MongoDB Bundle, following the instruction from this link: DoctrineMongoDBBundle . 我目前正在按照此链接的说明使用Symfony 4和Doctrine MongoDB Bundle: DoctrineMongoDBBundle So, I have a UserDocument: 因此,我有一个UserDocument:

src/Document/UserDocument.php 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 src / Repository / UserRepository.php

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

}

src/Controller/Content.php src / Controller / Content.php

class Content extends Controller 类内容扩展Controller

{

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


}

So, after running the content page, I got the following error: 因此,运行内容页面后,出现以下错误:

Cannot autowire service "App\\Repository\\UserRepository": argument "$uow" of method "__construct()" references class "Doctrine\\ODM\\MongoDB\\UnitOfWork" but no such service exists. 无法自动装配服务“ App \\ Repository \\ UserRepository”:方法“ __construct()”的参数“ $ uow”引用类“ Doctrine \\ ODM \\ MongoDB \\ UnitOfWork”,但不存在此类服务。

The DocumentRepository constructor looks like this: DocumentRepository构造函数如下所示:

public function __construct(DocumentManager $dm, UnitOfWork $uow, ClassMetadata $classMetadata)
    {
        parent::__construct($dm, $uow, $classMetadata);
    }

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. 存储库不应该是服务,但如果要保持这种状态,只需自动连接DocumentManager并从Document Manager中获取uow和classmetadata。

UnitOfWork and ClassMetadata can't be autowired UnitOfWorkClassMetadata无法自动ClassMetadata

Do something like that in your UserRepository , it should work. UserRepository执行类似的UserRepository ,它应该可以工作。

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

Make sure to exclude your repository class from autowiring. 确保从自动装配中排除存储库类。 Example here: https://symfony.com/doc/current/service_container/3.3-di-changes.html 此处的示例: https : //symfony.com/doc/current/service_container/3.3-di-changes.html

In case you want your repository class as a service you should do it using a factory service. 如果您希望将存储库类作为服务,则应使用工厂服务来进行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM