【发布时间】:2016-05-03 19:17:06
【问题描述】:
我有几条以/experiment/{id}/... 开头的路由,我厌倦了重写相同的逻辑来检索已登录用户的实验。我想我可以重构我的代码,但我猜@ParamConverter 会是一个更好的解决方案。
如何重写以下代码以利用 Symfony 的 @ParamConverter 功能?
/**
* Displays details about an Experiment entity, including stats.
*
* @Route("/experiment/{id}/report", requirements={"id" = "\d+"}, name="experiment_report")
* @Method("GET")
* @Template()
* @Security("has_role('ROLE_USER')")
*/
public function reportAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$experiment = $em->getRepository('AppBundle:Experiment')
->findOneBy(array(
'id' => $id,
'user' => $this->getUser(),
));
if (!$experiment) {
throw $this->createNotFoundException('Unable to find Experiment entity.');
}
// ...
}
实验实体有composite primary keys如下:
class Experiment
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
*/
protected $id;
/**
* @var integer
*
* @ORM\Column(name="user_id", type="integer")
* @ORM\Id
*/
protected $userId;
/**
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="experiments", cascade={"persist"})
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
// ..
}
我想在路由中使用他们的用户 id 和一个实验 id 检索已登录用户的实验。
【问题讨论】:
-
自定义参数转换器就足够了,只需将
security.token_storage和doctrine作为参数注入您的自定义参数转换器服务。 stfalcon.com/en/blog/post/symfony2-custom-paramconverter -
非常感谢@malcolm 我已经接受了 jkucharovic 的回答,其中详细说明了您的建议:)
标签: php symfony doctrine-orm doctrine