iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
0
Modern Web

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

Day#16 自己要的東西自己生!! 客製化Filter

  • 分享至 

  • xImage
  •  

上一篇我們提到Doctrine ORM 提供的一些Filter,
可是身為工程師的我們也知道...客戶的需求有時候是五彩斑斕的黑,
我們也要想辦法變出來,一些我們想要但套件沒得使用的東西,我們必須自己來生,
所以除了前面的Validator,Service可以客製化外,當然Filter也可以阿!!
一貫做法當然就是開一個Class 然後去繼承相關的Class,然後裡面寫自己想要過濾的東西


Doctrine ORM底下提供的Filter 都是繼承 AbstractContextAwareFilter

所以首先,我們先再src下建立一個子目錄叫Filter,專門存放我們自己客製化的,
在裡面建立一個Class 然後extends AbstractContextAwareFilter

當我extends這個Class的時候,它會強迫我要實作兩個function,
通常如果有extends Class 然後看到紅蚯蚓的話,八九不離十就是要你實作啦~
所以我們就大力地把implement Methods 按下去吧

按下去之後,要實作的方法就是上面藍藍的那兩個,
filterPorperty是過濾器的主體,也就是我們必須將我們要過濾的條件和所代表的property寫在裡面,
description 是用來描述這個filter的一些屬性

 protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
    {
        if (
            $property !== "nameSearch"
        ) {
            return;
        }

        $parameterName = $queryNameGenerator->generateParameterName($property);

        if ($value = "小叮噹"){
            $queryBuilder
                ->andWhere(sprintf('o.status = :%s', $parameterName))
                ->setParameter($parameterName, '小叮噹');
        }
    }

$property 是我們在使用這個filter時,所指定的欄位, 判斷如果不是我們所傳入的,就return掉這個filter ,
如果是的話才往下執行, 將我們傳入的property註冊成queryName,接著判斷我們傳入的值,
如果是該值的話,就幫我們從資料庫撈出來並回傳,以上舉例是,幫我回傳名字叫"小叮噹"的資料

public function getDescription(string $resourceClass): array
    {
        if (!$this->properties) {
            return [];
        }

        $description = [];
        foreach ($this->properties as $property => $strategy) {
            $description["$property"] = [
                'property' => $property,
                'type' => 'string',
                'required' => false,
                'swagger' => [
                    'description' => 'Filter name',
                    'name' => 'nameFilter',
                    'type' => 'string',
                ],
            ];
        }

        return $description;
    }

如果不是我們傳入的property,就回傳空的陣列,
如果是的話,就回傳,propert名稱,型態,描述等等...描述只是方便我們辨識我們用到的是哪個filter

建立完Filter了,我們必須使用在我們的實體類上,使用方法就跟使用ORM底下的Filter一樣

properties裡面放的就是我們在Filter裡所設定的,前面放的則是我們的Filter Class ,

記得要import 我們寫的Filter Class哦 ! 不然一樣會報500給各位看,
好像在報500前,那個class那邊的顏色就會警告了,聰明如IDE 會先提醒我們


這一篇把Filter講完了,下一篇要來介紹,api platform 裡提供的一個功能 => 換頁 ,及一些attributes的設定

原來今天已經過半了呀.....小菜鳥還在繼續慢慢地往前飛,應該是不會半路墜機啦XD


上一篇
Day#15 老闆~貢丸湯不要貢丸,蚵仔煎不要蚵仔! - Filter
下一篇
Day#17 分頁設定Pagination 及 Attributes 裡一些哩哩摳摳的設定=͟͟͞͞( •̀д•́)
系列文
PHP框架-Symfony4 + api platform 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言