【问题标题】:Symfony - Which link was clickedSymfony - 点击了哪个链接
【发布时间】:2016-02-09 23:12:54
【问题描述】:

我正在 Symfony 中为我大学的编程课构建简单的汽车租赁应用程序。

我不知道如何解决的问题是休闲:

表单数据库查询我得到可用汽车的列表,并使用树枝模板轻松显示它们。

我希望在每辆列出的汽车旁边有一个按钮,该按钮链接到用户提供所有必需信息的 /rent 网站。

我知道我可以使用类似的东西:

 <a href="{{ path('rent', {'id': car.id}) }}">

但是有没有其他方法让负责这条路线的控制器知道点击了哪个链接?毕竟我需要知道哪个汽车用户想租,我不想最终得到 url /rent/{id}。

【问题讨论】:

    标签: symfony


    【解决方案1】:

    我知道已经提供了一些其他解决方案,但我想提供更多解释以及稍微不同的建议。 Pipe 的响应在正确的轨道上并且有效,但出于您的目的,我不会只为每辆车生成一个随机令牌,我会在每辆 SEO 友好的汽车上绑定一个 slug

    例如,在您的汽车表中,您将拥有:

    +-------+--------------+
    |  id   |    slug      |
    +-------+--------------+
    |   1   | ford-150     |
    |   2   | cadillac-cts |
    +-------+--------------+
    

    然后您的实体将具有相应的变量和 Doctrine 注释,如下所示:

    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    class Car
    {
        /**
         * @var int
         *
         * @ORM\Id
         * @ORM\Column(name="id", type="integer")
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(name="slug", type="string", length=50, nullable=false)
         */
        private $slug;
    }
    

    现在您在 Twig 中生成的链接将如下所示:

    <a href="{{ path('rent', {'slug': car.slug}) }}">
    

    那么你的控制器/路由可以这样定义:

    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    
    class RentController extends Controller
    {
        /**
         * @Route("/rent/{slug}", name="rent")
         */
        public function rentAction(Car $car)
        {
            // logic here
        }
    }
    

    这里 Symfony 使用 ParamConverter 和您的 Car $car type hint 来自动使用 slug 属性并找到与该 slug 匹配的相应 Car 实体。

    它本质上是以下操作的快捷方式,您也可以这样做,而不是使用参数转换器:

    /**
     * @Route("/rent/{slug}")
     */
    public function rentAction($slug)
    {
        $em = $this->getDoctrine()->getManager();
        $car = $em->getRepository('AppBundle:Car')->findOneBySlug($slug);
    
        // ...
    }
    

    这将允许您保留对用户有意义的友好 URL,同时完全隐藏 ID。

    【讨论】:

    • 谢谢你,完美的解决方案。
    【解决方案2】:

    如果您不想在 URL 上显示 car.id,请为每辆汽车创建一个随机“令牌”并将 URL 设为:

    <a href="{{ path('rent', {'id': car.token}) }}">
    

    那就是/rent/abcd5437fbadce88

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 2021-10-21
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多