私は/experiment/{id}/...
で始まるいくつかのルートを持っており、サインインしたユーザーの実験を取得するために同じロジックを書き直すことに飽き飽きしています。私は私のコードをリファクタリングできると思うが、私は@ParamConverter
がより良い解決策になると推測している。Symfony @ParamConverterはユーザー関係を通じてエンティティを取得します
symfonyの@ParamConverter機能を利用するには、次のコードをどのように書き換えるのですか?私は自分のユーザーid
とルートで実験id
を使用してユーザーの実験で調印取得したい
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;
// ..
}
次のように
/**
* 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を持っています。
は、カスタムのparamコンバータは十分に、ちょうど注入 'security.token_storage'と'教義になります'をカスタムパラームコンバーターサービスの引数として使用します。 http://stfalcon.com/en/blog/post/symfony2-custom-paramconverter – malcolm
多くのありがとう@malcolm私はjkucharovicの答えを受け入れました。これはあなたが何を示唆しているかを正確に示しています:) – mattvick