是的,這篇我們要來假裝牛逼...不是啦~總是要把前面的東西統整一下,不然大家看到這裡可能忘了自己是誰...
首先,在建立customize api 前 ,
我們要先備妥兩樣東西,一個Controller跟一個Repository (可以看作可以撈資料的倉庫) ,
因為小菜鳥這次沒有介紹到Doctrine,所以這邊建置Repository就請各位看官們先按照步驟囉~
1.在src目錄下的子目錄Controller裡再建立一個子目錄叫API,
是專門拿來放置API相關的Controller (這是我的習慣啦~當然也可以通通丟到Controller子目錄裡,只是到時候要找可能就要花點時間),接著再API這個子目錄裡建立一個Controller,完工以後我們要來建立Repository
2.在src目錄下建置一個子目錄叫Repository,裡面放置各個實體類的倉庫,
接著在裡面建立一個Repository,其實它就是一般的Class,只是要繼承ServiceEntityRepository,
來將它註冊成一個倉庫
繼承完ServiceEntityRepository,我們必須複寫它的建構子
接著將第二個參數拿掉,裡面再去呼叫一次父類別的建構子,這次必須將實體類的Class傳入第二個參數
class TestRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, TestEntity::class);
}
}
以上,建置完倉庫了,接著要進入重頭戲 Api Controller了~
回到我們的Controller
先把剛剛建立的Repository用先前有提到的依賴注入寫進建構子裡
/**
* @var TestRepository
*/
private $repository;
/**
* GetNameTestController constructor.
*/
public function __construct(TestRepository $repository)
{
$this->repository = $repository;
}
複寫__invoke這個function,這個function是,當我執行到這支Controller時,預設會進到這個function做執行
接著在invoke上給予Route,將它視為一個路徑,
畢竟訪問API時,就是要有路徑才能訪問阿XD~ 不然我怎麼知道我今天要叫哪一家便當!!!?
/**
* @Route(
* path="/api/testEntity/name",
* name="get_name_test_controller",
* methods={"GET"},
* defaults={
* "_api_respond"=true,
* "_api_normalization_context"={"api_sub_level"=true},
* "_api_swagger_context"={
* "tags"={"TestEntity"},
* "summary"="取得名字叫做作叮噹的",
* "responses"={
* "200"={
* "description"="取得名字叫作小叮噹的",
* "schema"={
* "type"="object",
* "properties"={
* "defaultLocale"={"type"="string"},
* "locales"={"type"="array", "items"={"type"="string"}}
* }
* }
* }
* }
* }
* }
* )
*/
public function __invoke()
{
}
那Route裡的path跟name,在先前有提過,method就是使用的方法,比較特別的是defaults裡面的東西,
講幾個比較常用的,swagger context 就是我們在api頁面上看到的相關資訊
Api Controller 也建立完畢後,我們就要讓這支Api來做動作了,
我們要在invoke這個function裡,利用剛剛所建立的Repository來找名字叫做小叮噹的資料
public function __invoke()
{
$data = $this->repository->findBy(["name"=>"小叮噹"]);
return new JsonResponse($data, 200);
}
findBy 是一次找多筆 , 出來的型態是陣列 , 裡面有很多筆物件
findOneBy 是一次找一筆 , 出來就直接是一筆物件了
括弧裡代的是欄位的查詢條件, => 後面放的是要查詢的值 ,當然裡面也可以放orderBy(排序) ,但這裡就先不介紹了,
畢竟小菜鳥這次也沒有提到Repository的詳細介紹
最後return Json ,這樣我們從前端訪問這支API所拿到的資料就是我們要的那些名叫小叮噹的資料囉!!
好了到這邊,哩哩摳摳拉拉雜雜的把最簡易的customize api 做好了 ,
下一篇我們要來探討權限的問題,還有一個小菜鳥最近踩到的地雷R , 實在是有點大顆的那種....