kjgkjhkjh
kjgkjhkjh

Reputation: 61

Symfony 4 : Cannot autowire argument $manager of ... it references interface "Doctrine\Common\Persistence\ObjectManager"

when i submit my form i got this error :

Cannot autowire argument $manager of "App\Controller\AdController::create()": it references interface "Doctrine\Common\Persistence\ObjectManager" but no such service exists. You should maybe alias this interface to the existing "doctrine.orm.default_entity_manager" service.

This is in function create in AdController.php:

<?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
        ]);
    }
}

and this is my 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,
    ]);
}

}

Why i get this error when i submit my form and how can i solve this problem

Thank you in advance

Upvotes: 6

Views: 27706

Answers (8)

khadijaiig
khadijaiig

Reputation: 19

Try to use EntityManagerInterface instead of ObjectManager.

Upvotes: 0

Hedi science-Tech
Hedi science-Tech

Reputation: 1

Try changing this

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

To this

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

Upvotes: 0

Hedi science-Tech
Hedi science-Tech

Reputation: 1

You must change this:

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

To this:

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

Upvotes: -2

Jassem Griss
Jassem Griss

Reputation: 1

You must change this use:

use Doctrine\Common\Persistence\ObjectManager;

to this use:

use Doctrine\Persistence\ObjectManager;

Upvotes: 0

rnenciu
rnenciu

Reputation: 368

use ManagerRegistry service instead of 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()
    ]);
}

Upvotes: 1

some_guy
some_guy

Reputation: 390

The error actually says you should alias that class to an existing service. That happens when Symfony does not know which implementation of interface you are going to use.

Try something like this:

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

Add it in services.yml and try.

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

Upvotes: 5

dev-sf-20
dev-sf-20

Reputation: 9

try with this:

use Doctrine\ORM\EntityManagerInterface;

class Someclass {
protected $em;

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

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

}

Upvotes: 0

JessGabriel
JessGabriel

Reputation: 1072

You should avoid using directly the service. Always use the contract instead. It is available for every services

So instead of using ObjectManager directly, use EntityManagerInterface

Upvotes: 9

Related Questions