首页 > 解决方案 > Symfony 4 - 在路由中使用简单的实体注入器

问题描述

使用 Symfony 4.0,我尝试使用我的路由注入我的实体。

这是我的控制器:

   /**
     * @param TblResidence $tblResidence
     * @return \Symfony\Component\HttpFoundation\Response
     * @Route("/residences/{res_id}", name="residences_view")
     */
    public function view(TblResidence $tblResidence)
    {
        return $this->render('residences/view.html.twig', [
            'residence' => $tblResidence,
        ]);
    }

这是我的实体:

/**
 * TblResidence
 *
 * @ORM\Table(name="tbl_residence", indexes={@ORM\Index(name="syn_id", columns={"syn_id"}), @ORM\Index(name="uti_id_crea", columns={"uti_id_crea"}), @ORM\Index(name="uti_id_maj", columns={"uti_id_maj"}), @ORM\Index(name="exp_id", columns={"exp_id"}), @ORM\Index(name="res_code", columns={"res_code"}), @ORM\Index(name="mar_id", columns={"mar_id"}), @ORM\Index(name="not_id", columns={"not_id"}), @ORM\Index(name="seg_id", columns={"seg_id"})})
 * @ORM\Entity
 */
class TblResidence
{
    /**
     * @var int
     *
     * @ORM\Column(name="res_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $resId;

    ....

现在我得到了这个错误:

控制器“App\Controller\ResidencesController::view()”要求您为“$tblResidence”参数提供一个值。参数可以为空并且没有提供空值,没有提供默认值,或者因为在此参数之后有一个非可选参数。

我认为我不需要使用 ParamConverter(老实说,我没有找到关于它的 SF4 文档),因为我只想使用 ID 进行匹配。我试过resId,作为参数名称idres_id仍然是同样的错误。

我会错过什么吗(是的,我当然会)?

编辑

我从 composer 安装了这个包:

composer require sensio/framework-extra-bundle

现在它可以工作了,ParamConverter 似乎依赖于这个包。

更多信息:https ://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/index.html

标签: symfony

解决方案


您的参数必须像您的实体一样被称为 resId。如果您想使用不同的名称,则必须明确使用 @ParamConverter 注释:https ://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html#doctrine-converter

/**
 * @param TblResidence $tblResidence
 * @return \Symfony\Component\HttpFoundation\Response
 * @Route("/residences/{resId}", name="residences_view")
 */
public function view(TblResidence $tblResidence = null)
{
    return $this->render('residences/view.html.twig', [
        'residence' => $tblResidence,
    ]);
}

推荐阅读