繁体   English   中英

Symfony 4:无法自动装配参数 $manager of ... 它引用接口“Doctrine\\Common\\Persistence\\ObjectManager”

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

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