【问题标题】:Unable to guess how to get a Doctrine instance from the request information for parameter "bookpermit"无法猜测如何从参数“bookpermit”的请求信息中获取 Doctrine 实例
【发布时间】:2017-12-15 10:18:54
【问题描述】:

我正在尝试使用 symfony 中的 @ParamConverter 将多个参数动态传递到路由 url。下面是我的架构结构

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 文件的 sn-p

display_book_by_permission:
    pattern:  /displaybookbypermission/{user}
    defaults: { _controller:  xxxBundle:Books:display, _format: ~ }
    requirements:
        _method: GET

我删除了 bookpermit 的参数,因为我想从数据库中动态获取

下面是包含参数转换器的控制器定义

 /**
 * @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;
    }

我这样做的尝试是能够在调用 url 时返回此结果 xyz2+xyz1

http://localhost:88/books/web/app_dev.php/displaybookbypermission/6

【问题讨论】:

  • 首先,您为什么同时使用 yml 路由和注释路由?其次,在您的 bookpermit 表中,没有一个 bookfk 值引用 books.id 列。第三,books 表不应包含对用户的任何引用,因为看起来书籍和用户之间的关系是bookmermit 表。
  • bookfk 指的是 books 表中 usersfk 的(外键)。 books 有一个用户外键,而 bookspermit 有一个外键 bookfk
  • 我在 symfony 文档中看到了路由。请问如何将其转换为 yml 路由
  • 我们首先需要一些解释。此功能代表用户、书籍以及用户与书籍“交互”(出租、阅读等)的权限,对吧?这条路线的目的是获取允许提供的用户与之交互的书籍,对吧?
  • 权限表中非常正确。所以我们可以说 id 为 6 的用户只能被 6 和 7 的用户允许预订

标签: php symfony doctrine-orm


【解决方案1】:

正如原帖下方的 cmets 所述,您的功能是关于用户、书籍以及用户与书籍交互的权限。

那么,您应该有 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;
}

也许你需要纠正一些问题,但这是主要思想。

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 2021-06-27
    • 1970-01-01
    • 2012-04-01
    • 2021-01-20
    • 2015-12-14
    • 1970-01-01
    • 2016-05-03
    • 2019-11-25
    相关资源
    最近更新 更多