繁体   English   中英

如何将实体自动装配到服务中?

[英]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)

如果VideoMediaServicePhotoMediaService (为清楚起见,我重命名了它们,因为与您的实体共享名称使其看起来像是相关的)需要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.

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