![](/img/trans.png)
[英]Symfony: Cannot autowire argument $injectedVar of "Controller:method()": it references class "App\Entity\Entity" but no such service exists
[英]How to autowire an entity into a service?
我有一个名为AbstractMediaService
的抽象 class 和这个抽象 class 的一些具体实现:
abstract class AbstractMediaService
{
private $em;
private $media;
public function __construct(EntityManagerInterface $em, Media $media)
{
$this->em = $em;
$this->media = $media;
}
public function dosomethingInCommon();
abstract public function dosomethingSpecific();
}
class PhotoMediaService extends AbstractMediaService
{
public function dosomethingSpecific()
{
echo 'i am a photo service';
}
}
class VideoMediaService extends AbstractMedia
{
public function dosomethingSpecific()
{
echo 'i am a video service';
}
}
这些对象需要Media
实体才能使用
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
class Media
{}
Controller
/**
* @Route("/{_locale}/infos/{idMedia}.html", name="info", methods={"GET"}, requirements={
* "idMedia" = "\d+",
* })
*/
public function infosPhotoAction(RequestStack $requestStack, Media $media)
{
$request = $requestStack->getCurrentRequest();
$session = $requestStack->getSession();
$media = new PhotoMedia($media);
// return response
}
问题是我需要一些依赖项,例如Security
服务或EntityManager
。
我想知道如何自动装配AbstractMediaService
服务。
这是错误的。 您不能自动装配要注入到服务中的Media
,因为实体不是服务。
public function __construct(EntityManagerInterface $em, Media $media)
如果VideoMediaService
和PhotoMediaService
(为清楚起见,我重命名了它们,因为与您的实体共享名称使其看起来像是相关的)需要Media
的实例来执行某些工作,只需将其作为相应方法的参数即可。
public function dosomethingInCommon(Media $media);
abstract public function dosomethingSpecific(Media $media);
或者,只需在 class 上使用setMedia(Media $media)
方法即可:
public function setMedia(Media $media) {
$this->media = $media;
}
坦率地说,后一种方法似乎不是一个好主意。 您需要让适用于$media
的方法意识到尚未调用 setMedia( setMedia()
的可能性,否则对setMedia()
的后续调用将改变服务的行为方式。 将其作为适当方法的参数会更简洁、更清晰、更安全。
注入这些服务就像任何其他服务一样完成。 他们扩展抽象 class 是无关紧要的。
/**
* @Route("/{_locale}/infos/{idMedia}.html", name="info", methods= {"GET"}, requirements={
* "idMedia" = "\d+",
* })
*/
public function infosPhotoAction(RequestStack $requestStack, Media $media, PhotoMediaService $photoMediaService): Response
{
$request = $requestStack->getCurrentRequest();
$session = $requestStack->getSession();
$photoMediaService->doSomethingSpecific($media)
return new Response('all done');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.