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

时间:2019-12-08 21:52:52

标签: php symfony doctrine-orm

当我提交表格时,出现此错误:

  

无法自动装配“ App \ Controller \ AdController :: create()”的参数$ manager:它引用接口“ Doctrine \ Common \ Persistence \ ObjectManager”,但不存在这样的服务。您可能应该将此接口别名为现有的“ doctrine.orm.default_entity_manager”服务。

这是在AdController.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,
    ]);
}

这是我的AdType.php:

def myfunc_1():
    my_file = open("ex1_sample_data.txt", "r")
    my_list = []
    for i in my_file:
        my_list.append(i)
    return my_list

print(myfunc_1())

def myfunc_2():
    file = open("ex1_sample_data.txt", "r")
    for string_line in file:
        string_line = string_line.strip()
        my_tuple = myfunc_1(string_line)
        my_list.append(my_tuple)
    return my_list

print(myfunc_2())

}

为什么我提交表单时会收到此错误?如何解决此问题

提前谢谢

8 个答案:

答案 0 :(得分:1)

该错误实际上表明您应该将该类别名为现有服务。当Symfony不知道您要使用哪种接口实现时,就会发生这种情况。

尝试这样的事情:

Doctrine\Common\Persistence\ObjectManager: '@doctrine.orm.default_entity_manager'

将其添加到services.yml中,然后尝试。

docs:https://symfony.com/doc/current/service_container/autowiring.html#using-aliases-to-enable-autowiring

答案 1 :(得分:1)

您应该避免直接使用该服务。始终使用合同代替。 它适用于所有服务

因此,不要直接使用package Testmavenproject.Project; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class Testing { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver","/Project/Driver/chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://www.qr-code-generator.com/"); } } ,而要使用ObjectManager

答案 2 :(得分:0)

尝试一下:

use Doctrine\ORM\EntityManagerInterface;

class Someclass {
protected $em;

public function __construct(EntityManagerInterface $entityManager)
{
    $this->em = $entityManager;
}

public function somefunction() {
    $em = $this->em;
    ...
}

}

答案 3 :(得分:0)

使用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()
    ]);
}

答案 4 :(得分:0)

您必须更改此用法:

use Doctrine\Common\Persistence\ObjectManager;

为此用途:

use Doctrine\Persistence\ObjectManager;

答案 5 :(得分:0)

尝试改变这个

$manager->persist($ad);
$manager->flush();

为此

$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();

答案 6 :(得分:0)

尝试使用 EntityManagerInterface 而不是 ObjectManager

答案 7 :(得分:-1)

你必须改变这个:

$manager->persist($ad);
$manager->flush();

为此:

$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();