繁体   English   中英

Symfony 4 - 自动装配不起作用

[英]Symfony 4 - Autowiring not working

我有一个将值写入特定实体的表单,我正在尝试通过控制器中的函数编辑信息,非常简单。

银行控制器.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()]
        )
        );
    }
}

问题是,当我访问 /banco/{id} 时,出现错误:

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

我的 service.yaml 都是默认的,所以我想它应该可以自动工作。 实体不显示在 bin/console debug:container 中。

如果我像这样在 services.yaml 中手动声明实体

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

它可以工作,但是现在当我访问 /banco/{id} 时,表单变空,数据库中没有存在的信息,如果我输入内容并提交,数据库中没有任何变化。

如果我转到调试工具栏并检查查询,它似乎是在查询登录用户的 ID,而不是实体“Banco”的 ID。

顺便说一句,这个实体表有一个 FK user_id。 也许这就是问题所在? 我迷路了,所以我需要一点帮助。 我是 PHP/Symfony 的新手。 谢谢

好吧,由于某些未知原因, sensio/framework-extra-bundle没有完全安装。

我刚刚运行composer require annotations ,现在一切都按预期工作。

该死,浪费了 2 天试图解决这个问题..

谢谢大家 !

SensioFrameworkExtraBundle 的路由注释自 5.2 版以来已被弃用,因为它们现在是 Symfony 的核心功能。

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

您可以尝试这些来清理(尝试前备份 composer.json)

更新 composer.json "require": { "symfony/symfony": "^4.3", },运行这些命令;

composer update symfony/symfony

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

Symfony 将自动装配实体,但它将是一个空实体。 更好的方法是自动装配存储库,从请求中获取 ID 并通过其 ID 从存储库中获取 Banco。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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