iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
Modern Web

PHP框架-Symfony4 + api platform 系列 第 18

Day#18 自己產出一個Get API - Customize Get API

是的,這篇我們要來假裝牛逼...不是啦~總是要把前面的東西統整一下,不然大家看到這裡可能忘了自己是誰...


首先,在建立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頁面上看到的相關資訊

    • tag是那一支API的標籤
    • summary是API的敘述
    • response 200是成功的http回應碼 , description 是成功後所看見的敘述

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 , 實在是有點大顆的那種....


上一篇
Day#17 分頁設定Pagination 及 Attributes 裡一些哩哩摳摳的設定=͟͟͞͞( •̀д•́)
下一篇
Day#19 哪扇API的門用哪把鑰匙開 - 權限
系列文
PHP框架-Symfony4 + api platform 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言