简体   繁体   中英

Symfony 4 - Autowiring not working

I have a form that write values to an specific Entity, and I am trying to edit the information through a function in the controller, pretty simple.

BancoController.php

<?php

namespace App\Controller;

use App\Entity\Banco;
use App\Form\BancoType;
use App\Repository\BancoRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class BancoController{

    private $twig;

    private $bancoRepository;

    private $formFactory;

    private $entityManager;

    private $router;

    private $flashBag;

    private $authorizationChecker;

    public function __construct(
        \Twig_Environment $twig, 
        BancoRepository $bancoRepository, 
        FormFactoryInterface $formFactory, 
        EntityManagerInterface $entityManager, 
        RouterInterface $router,
        FlashBagInterface $flashBag,
        AuthorizationCheckerInterface $authorizationChecker
    ){
        $this->twig = $twig;
        $this->bancoRepository = $bancoRepository;
        $this->formFactory = $formFactory;
        $this->entityManager = $entityManager;
        $this->router = $router;
        $this->flashBag = $flashBag;
        $this->authorizationChecker = $authorizationChecker;
    }

    /**
    * @Route("/cadastro/bancos", name="cadastro_banco")
    */
    public function index(TokenStorageInterface $tokenStorage){

        $usuario = $tokenStorage->getToken()->getUser();

        $html = $this->twig->render('bancos/index.html.twig', [
            'bancos' => $this->bancoRepository->findBy(array('usuario' => $usuario))
        ]);

        return new Response($html);
    }

    /**
    * @Route("/banco/{id}", name="editar")
    */
    public function editarBanco(Banco $banco, Request $request) {

        $form = $this->formFactory->create(
            BancoType::class,
            $banco
        );
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()){
            $this->entityManager->flush();

            return new RedirectResponse($this->router->generate('cadastro_banco'));
        }

        return new Response(
            $this->twig->render(
                'bancos/cadastro.html.twig',
                ['form' => $form->createView()]
            ));
    }

    /**
    * @Route("/cadastro/cadastrar-banco", name="cadastro_banco-nova")
    */
    public function cadastrar(Request $request, TokenStorageInterface $tokenStorage){

        $usuario = $tokenStorage->getToken()->getUser();

        $banco = new Banco();
        $banco->setUsuario($usuario);

        $form = $this->formFactory->create(BancoType::class, $banco);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()){
            $this->entityManager->persist($banco);
            $this->entityManager->flush();

            return new RedirectResponse($this->router->generate('cadastro_banco'));
        }

        return new Response(
            $this->twig->render(
                'bancos/cadastro.html.twig',
                ['form' => $form->createView()]
        )
        );
    }
}

The problem is, when I access /banco/{id}, I get the error:

"Cannot autowire argument $banco of "App\Controller\BancoController::editarBanco()": it references class "App\Entity\Banco" but no such service exists."

My service.yaml is all default, so I guess it should work automatically. The entities doesn't show in bin/console debug:container.

If I declare manually the Entity in services.yaml like this

App\Entity\Banco:
    autowire: true
    autoconfigure: true
    public: false

it works, but now when I access /banco/{id} the form comes empty without the information that exists in the database, and if I type something and submit it, nothing changes in the database.

If I go to the debug toolbar and check the query, it appears that it is querying the ID of the user logged in, and not the ID of the Entity 'Banco'.

Btw, this Entity Table has a FK user_id. Maybe that's where lies the problem? I am lost so I need a little help. I am new to PHP/Symfony. Thank you

Well, for some unknown reason sensio/framework-extra-bundle was not fully installed.

I just ran composer require annotations and now everything works as expected.

Damn, wasted 2 days trying to fix this..

Thank you everyone !

Routing annotations of the SensioFrameworkExtraBundle are deprecated since version 5.2 because they are now a core feature of Symfony.

https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/routing.html

You may try these to clean up (backup composer.json before trying)

Update composer.json "require": { "symfony/symfony": "^4.3", }, Run these commands ;

composer update symfony/symfony

composer update "symfony/*" --with-all-dependencies

The Symfony will autowire the Entity but it will be an empty one. Better way is to autowire the Repository, get the ID from the Request and fetch the Banco from the Repository by it's ID.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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