![](/img/trans.png)
[英]Class Doctrine\Common\Persistence\ObjectManager does not exist
[英]Symfony 4 : Cannot autowire argument $manager of ... it references interface "Doctrine\Common\Persistence\ObjectManager"
當我提交表單時出現此錯誤:
無法自動裝配“App\\Controller\\AdController::create()”的參數 $manager:它引用接口“Doctrine\\Common\\Persistence\\ObjectManager”,但不存在這樣的服務。 您可能應該將此接口別名為現有的“doctrine.orm.default_entity_manager”服務。
這是在 AdController.php 中的函數 create 中:
<?php
namespace App\Controller;
use App\Entity\Ad;
use App\Form\AdType;
use App\Repository\AdRepository;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class AdController extends AbstractController
{
/**
* @Route("/ads", name="ads_index")
*/
public function index(AdRepository $repo)
{
$ads = $repo->findAll();
return $this->render('ad/index.html.twig', [
'ads' => $ads,
]);
}
/**
* @Route("/ads/new", name="ads_create")
*
* @return Response
*/
public function create(Request $request, ObjectManager $manager){
$ad = new Ad();
$form = $this->createForm(AdType::class, $ad);
$form->handleRequest($request);//symfony va faire le lien entre les donne des champs fu formulaire et la variable $ad
if($form->isSubmitted() && $form->isValid() ){
$manager->persist($ad);
$manager->flush();
}
return $this->render("ad/new.html.twig", [
'form' => $form->createView()
]);
}
/**
* @Route("/ads/{slug}", name="ads_show")
* @return Response
*/
public function show(Ad $ad){
return $this->render('ad/show.html.twig', [
'ad' => $ad
]);
}
}
這是我的 AdType.php :
<?php
namespace App\Form;
use App\Entity\Ad;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
class AdType extends AbstractType
{
/**
* @param string $label
* @param string $placeholder
* @return array
*/
private function getConfiguration($label, $placeholder){
return [
'label' => $label,
'attr' => [
'placeholder' => $placeholder
]
];
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class, $this->getConfiguration("titre", "tapez un super titre pour votre annonce"))
->add('slug', TextType::class, $this->getConfiguration("Adresse web", "tapez l'adresse web (automatique)"))
->add('coverImage', UrlType::class, $this->getConfiguration("Url de l'image principal", "Donnez l'adresse d'une image qui donne vraiment envie"))
->add('introduction', TextType::class, $this->getConfiguration("introduction", "donnez une description global de l'annonce"))
->add('content', TextareaType::class, $this->getConfiguration("Description detaille", "tapez une description qui donne vraiment envie de venir chez vous !"))
->add('price', MoneyType::class, $this->getConfiguration("Prix par nuit", "indiquez le prix que voulez pour une nuit"))
->add('rooms', IntegerType::class, $this->getConfiguration("Nombre de chambre", "le nom de chambres disponibles"))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Ad::class,
]);
}
}
為什么在提交表單時出現此錯誤以及如何解決此問題
先感謝您
您應該避免直接使用該服務。 始終使用合約代替。 它適用於所有服務
所以不要直接使用ObjectManager
,而是使用EntityManagerInterface
該錯誤實際上是說您應該將該類別名為現有服務。 當 Symfony 不知道您將使用哪種接口實現時,就會發生這種情況。
嘗試這樣的事情:
Doctrine\Common\Persistence\ObjectManager: '@doctrine.orm.default_entity_manager'
將其添加到 services.yml 中並嘗試。
文檔: https : //symfony.com/doc/current/service_container/autowiring.html#using-aliases-to-enable-autowiring
使用ManagerRegistry
服務代替ObjectManager
/**
* @Route("/ads/new", name="ads_create")
*
* @return Response
*/
public function create(Request $request, ManagerRegistry $managerRegistry){
$ad = new Ad();
$form = $this->createForm(AdType::class, $ad);
$form->handleRequest($request);//symfony va faire le lien entre les donne des champs fu formulaire et la variable $ad
if($form->isSubmitted() && $form->isValid() ){
$em = $managerRegistry->getManager();
$em->persist($ad);
$em->flush();
}
return $this->render("ad/new.html.twig", [
'form' => $form->createView()
]);
}
試試這個:
use Doctrine\ORM\EntityManagerInterface;
class Someclass {
protected $em;
public function __construct(EntityManagerInterface $entityManager)
{
$this->em = $entityManager;
}
public function somefunction() {
$em = $this->em;
...
}
}
您必須更改此用途:
use Doctrine\Common\Persistence\ObjectManager;
用於此用途:
use Doctrine\Persistence\ObjectManager;
嘗試改變這個
$manager->persist($ad);
$manager->flush();
對此
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
嘗試使用EntityManagerInterface
而不是ObjectManager
。
你必須改變這一點:
$manager->persist($ad);
$manager->flush();
對此:
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.