Symfony 4 - 在路由

时间:2018-06-04 10:44:07

标签: symfony

使用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;

    ....

现在我收到了这个错误:

  

Controller" App \ Controller \ ResidencesController :: view()"要求   你为" $ tblResidence"提供了价值。论点。要么是   参数可以为空,并且没有提供空值,没有默认值   已提供值或因为存在非可选参数   在这之后。

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

我是否会遗漏某些东西(是的,我当然会这样做)?

修改

我从composer安装了这个包:

composer require sensio/framework-extra-bundle

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

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

3 个答案:

答案 0 :(得分:2)

您的参数必须像实体一样调用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,
    ]);
}

答案 1 :(得分:0)

我认为您必须将$tblResidence参数设置为可空,因为此处您的类型提示要求您提供TblResidence而不提供任何其他内容。

这样的事情应该完成工作($tblResidence是你的实体标识符)。

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

答案 2 :(得分:0)

我从composer安装了这个包:

  

作曲家需要sensio / framework-extra-bundle

现在它起作用了,ParamConverter似乎依赖于这个包。

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

并使用Entity:

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