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.