我有一個名為的抽象類AbstractMediaService和這個抽象類的一些特定實作:
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
{}
控制器
/**
* @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.
我想知道autowireAbstractMediaService服務如何。
uj5u.com熱心網友回復:
這是錯誤的。您不能自動裝配Media以注入服務,因為物體不是服務。
public function __construct(EntityManagerInterface $em, Media $media)
如果VideoMediaService和PhotoMediaService(為了清楚起見,我重命名了它們,因為與您的物體共享名稱使其看起來像是相關的)需要一個實體Media來執行某些作業,只需將其作為相應方法的引數即可。
public function dosomethingInCommon(Media $media);
abstract public function dosomethingSpecific(Media $media);
或者,只需setMedia(Media $media)在該類上有一個方法:
public function setMedia(Media $media) {
$this->media = $media;
}
坦率地說,后一種方法似乎不是一個好主意。您需要使作業的方法意識到尚未呼叫$media的可能性,否則后續呼叫將改變服務的行為方式。只需將其作為適當方法的引數就更干凈、更清晰、更安全。setMedia()setMedia()
注入這些服務就像任何其他服務一樣。他們擴展抽象類是無關緊要的。
/**
* @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');
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/461392.html
