Symfony - 点击了哪个链接

时间:2016-02-09 23:12:55

标签: symfony

我正在Symfony建造一个简单的汽车租赁应用程序,用于我大学的编程课程。

我不知道如何解决的问题就像休耕一样:

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

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

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

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

但对于负责此路由的控制器是否还有其他方法可以知道单击了哪个链接?毕竟我需要知道哪个汽车用户想要租用,我不想以url / rent / {id}结束。

2 个答案:

答案 0 :(得分:0)

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

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

那将是/rent/abcd5437fbadce88

答案 1 :(得分:0)

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

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

+-------+--------------+
|  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使用ParamConverterCar $car type hint自动使用该slug属性,并找到与该slug匹配的相应Car实体。

它本质上是以下的快捷方式,你也可以这样做,而不是使用param转换器:

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

    // ...
}

这样您就可以保留一个对用户有意义的友好网址,同时也完全隐藏ID。