无法猜测如何从参数“bookpermit”

时间:2017-12-15 10:18:55

标签: php symfony doctrine-orm

我正在尝试使用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

1 个答案:

答案 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;
}

也许你会有一些事情要纠正,但这是主要的想法。