我有一個 api 端點,它應該根據他的 id 回傳一個用戶:user/{id}。
在我的控制器中,我有以下代碼:
/**
* @Api\Get("user/{id}")
* @SWG\Parameter(name="id", type="string", in="path", required=true)
*/
public function getUser(Request $request, string $id) {
$user = $this->getDoctrine()->getManager()->getRepository('App\Entity\User')->findUser($id);
return $this->view($user);
}
在我的存盤庫中,我有以下代碼:
public function findUser(string $id) {
$qb = $this->createQueryBuilder('a');
$qb->andWhere($qb->expr()->eq('a.id',':id'))->setParameter('id',$id);
return $qb->getQuery()->getOneOrNullResult();
}
它在獲取時作業正常user/4,但在獲取時也作業正常user/4ruqbu。
我只想讓用戶打開user/4而沒有結果user/4ruqbu。它應該回傳完全匹配。我認為問題在于 id 引數是一個字串。如果我將它更改為 int 它可以作業,但是如果我嘗試,我會收到錯誤而不是沒有結果user/4eiugq。
有辦法處理嗎?
uj5u.com熱心網友回復:
您的路由接受您的id引數的任何字串,這意味著任何值都將進入您的存盤庫方法。然后,如果您嘗試使用以數值開頭的字串作為整數,您將獲得該整數。在3v4l.org上親自嘗試:
var_dump((int)'4ruqbu'); // output: int(4)
您可以使用正則運算式進行引數驗證:
/**
* @Api\Get("user/{id<\d >}")
*/
public function getUser(Request $request, int $id) {
// ...
}
現在,對于/user/4ruqbu等 URI,這應該會失敗,因為它不滿足路由要求。
一些改進:
如果您安裝了sensio/framework-extra-bundle,您可以受益于ParamConverter并替換string $id為用戶:
public function getUser(User $user, Request $request)
{
// ...
}
避免使用等獲取與Doctrine相關的服務$this->getDoctrine()。使用自動裝配代替。如果您需要物體管理器來保存/更新/洗掉物體,請Doctrine\ORM\EntityManagerInterface向您的控制器方法添加一個引數。如果您需要使用存盤庫查詢物體,請添加一個使用其類鍵入的引數,如App\Repository\UserRepository您的情況:
// Example of controller method fetching services by autowiring:
public function myAction(EntityManagerInterface $em, UserRepository $userRepo)
{
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/322536.html
