引用 class "Doctrine\ODM\MongoDB\UnitOfWork" 但不存在此类服务
references class "Doctrine\ODM\MongoDB\UnitOfWork" but no such service exists
我目前正在使用 Symfony 4 和 Doctrine MongoDB Bundle,遵循此 link 中的说明:
DoctrineMongoDBBundle。所以,我有一个 UserDocument:
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
class 内容扩展控制器
{
/**
* @Route("/content", name="content")
* @param UserRepository $user
* @return Response
*/
public function index(UserRepository $user)
{
$user->findAll();
return new Response();
}
}
所以,在 运行 内容页面之后,我得到了以下错误:
Cannot autowire service "App\Repository\UserRepository": argument "$uow" of method "__construct()" references class "Doctrine\ODM\MongoDB\UnitOfWork" but no such service exists.
DocumentRepository 构造函数如下所示:
public function __construct(DocumentManager $dm, UnitOfWork $uow, ClassMetadata $classMetadata)
{
parent::__construct($dm, $uow, $classMetadata);
}
确保从自动装配中排除您的存储库 class。此处示例:https://symfony.com/doc/current/service_container/3.3-di-changes.html
如果您希望将存储库 class 作为一项服务,您应该使用工厂服务。
存储库不应该是服务,但如果您想保持这种状态,只需自动装配 DocumentManager
并从文档管理器中获取 uow 和 classmetdata。
UnitOfWork
和 ClassMetadata
无法自动装配
在你的 UserRepository
中做类似的事情,它应该有效。
public function __construct(DocumentManager $dm)
{
$uow = $dm->getUnitOfWork();
$classMetaData = $dm->getClassMetadata(User::class);
parent::__construct($dm, $uow, $classMetaData);
}
我目前正在使用 Symfony 4 和 Doctrine MongoDB Bundle,遵循此 link 中的说明: DoctrineMongoDBBundle。所以,我有一个 UserDocument:
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
class 内容扩展控制器
{
/**
* @Route("/content", name="content")
* @param UserRepository $user
* @return Response
*/
public function index(UserRepository $user)
{
$user->findAll();
return new Response();
}
}
所以,在 运行 内容页面之后,我得到了以下错误:
Cannot autowire service "App\Repository\UserRepository": argument "$uow" of method "__construct()" references class "Doctrine\ODM\MongoDB\UnitOfWork" but no such service exists.
DocumentRepository 构造函数如下所示:
public function __construct(DocumentManager $dm, UnitOfWork $uow, ClassMetadata $classMetadata)
{
parent::__construct($dm, $uow, $classMetadata);
}
确保从自动装配中排除您的存储库 class。此处示例:https://symfony.com/doc/current/service_container/3.3-di-changes.html
如果您希望将存储库 class 作为一项服务,您应该使用工厂服务。
存储库不应该是服务,但如果您想保持这种状态,只需自动装配 DocumentManager
并从文档管理器中获取 uow 和 classmetdata。
UnitOfWork
和 ClassMetadata
无法自动装配
在你的 UserRepository
中做类似的事情,它应该有效。
public function __construct(DocumentManager $dm)
{
$uow = $dm->getUnitOfWork();
$classMetaData = $dm->getClassMetadata(User::class);
parent::__construct($dm, $uow, $classMetaData);
}