我正在尝试使用symfony中的@ParamConverter将多个参数动态传递到路径网址中。以下是我的架构结构
bookpermit
id | userfk | bookfk |
1 | 6 | 6 |
2 | 6 | 7 |
3 | 7 | 7 |
4 | 8 | 8 |
books
id | name | uerfk |
1 | xyz1 | 6 |
2 | xyz2 | 7 |
3 | xyz3 | 8 |
以下是我的routing.yml文件的片段
display_book_by_permission:
pattern: /displaybookbypermission/{user}
defaults: { _controller: xxxBundle:Books:display, _format: ~ }
requirements:
_method: GET
我删除了bookpermit的参数,因为我想从数据库中动态获取
以下是我的控制器定义,其中包含paramconverter
/**
* @Route("/displaybookbypermission/{user}/{bookpermit}")
* @ParamConverter("user", class="xxxxBundle:Users")
* @ParamConverter("bookpermit", class="xxxxBundle:BookPermit")
* @Template()
*/
public function displayAction(Request $request, $user, $bookpermit)
{
$em = $this->getDoctrine()->getManager();
$bookLists= $em->getRepository("xxxBundle:Books")->findBy(
array(
"usersfk" => $user,
"usersfk" => $bookpermit
)
);
$data = array();
foreach ($bookLists as $bookList)
{
array_push($data, $this->serialize($bookLists));
}
$response = new Response(json_encode($data), 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
我这样做的尝试是能够在调用网址时返回此结果xyz2+xyz1
http://localhost:88/books/web/app_dev.php/displaybookbypermission/6
答案 0 :(得分:0)
正如以下评论中的原始帖子所述,您的功能是关于用户,图书和用户与图书互动的权限。
然后,您应该有3个实体,User,Book和BookPermit。
这是我们可以开始的最小模型图:
/**
* @ORM\Entity()
*/
class User
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
/**
* @ORM\Entity()
*/
class Book
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string")
*/
private $name;
}
/**
* @ORM\Entity()
*/
class BookPermit
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="xxxBundle\Entity\User")
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="xxxBundle\Entity\Book")
*/
private $book;
public function getUser()
{
return $this->user;
}
public function getBook()
{
return $this->book;
}
}
接下来,关于路线和控制器:
如评论中所述,您想使用yaml路由,然后在控制器中删除@Route(...)注释。
该路线提供给用户,并应返回书籍列表。 所以你需要的唯一参数就是用户。您可以使用User键入$ user参数,因此本机调用ParamConverter。您可以使用JsonResponse简化返回响应的方式。
路线(无需改动):
display_book_by_permission:
pattern: /displaybookbypermission/{user}
defaults: { _controller: xxxBundle:Books:display, _format: ~ }
requirements:
_method: GET
控制器:
use xxxBundle\Entity\User;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* @Template()
*/
public function displayAction(Request $request, User $user)
{
$em = $this->getDoctrine()->getManager();
$permits = $em->getRepository("xxxBundle:BookPermit")->findBy(array(
"user" => $user,
));
$books = array();
foreach ($permits as $permit) {
array_push($books, $permit->getBook());
}
$response = new JsonResponse($books, 200);
return $response;
}
也许你会有一些事情要纠正,但这是主要的想法。