iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
Modern Web

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

Day#3 從容器裡挖Service來用- 舉例簡易遮罩功能,然後給它依賴注入進去

上一篇有提到說,Service是存在在一個container裡,
而每個service都有一個id,在symfony3和4的差異在於呼叫Service的方法。


Symfony3,大部分的Services都是public的,所以可以透過兩種方法來呼叫

1.利用id直接呼叫

$this->get('service id');

2.從容器裡透過Service呼叫 ,只要Controller控制器有繼承Controller這個類別,就可以呼叫到container

class TestController extends Controller{

    public function test (){
		$myService=$this->container->get('這裡放serviceId')
    }

}



我們要怎麼知道哪個service 代表什麼id呢!!!?

php bin/console debug:container 

上述指令可以查詢到專案裡所有的services

藍色那一行的最後"token_storage"就是service的id,
為什麼不是整串呢!!!? 因為有一些Service他們的前綴會長的一樣,
若有相同前綴的service,用哪一個都可以達到相同物件的效果

Symfony4,除了大多數的第三方元件都將Service設為private外,
Symfony自己本身大部分的Service也都是private,所以必須透過 Dependency Injection (依賴注入)來呼叫

1.在建構子內呼叫,這樣一來,當程式一載入這個class的時候,建構子內的所有物件會先被初始化(initialized) ,
所以在這個class裡的所有function都可以透過property去呼叫物件或Service

class TestController  extends AbstractController(){

	 private $service;

	 public function __construct(TestServcie $service)
    {
        $this->service = $service;
       
    }

}

2.在帶有路由的Controller(Action)呼叫

class TestController extends AbstractController(){
	 /**
     * @Route(
     *     "/route",
     *     name="route"
     * )
     */
     public function testRoute (MyService $service){
     	
     
     }
}

一般的function沒辦法直接傳入物件,因為傳入的東西會被當成參數,

所以當我們呼叫一般的function 並且要使用物件時,需要再把物件傳入到該function裡才可以進行使用


下面舉例一個小菜鳥本人我寫的遮罩功能Service

首先,到src資料夾底下建立一個目錄名為Service,並在此目錄內建立一個Class

接著在裡面建立所要使用的function,以下舉例姓名與地址兩個

其實一開始小菜鳥我是用一堆if寫出來的,那時候才入職不到三個月,但因為大家都很討厭看到波動拳,所以經過改良,改成用switch寫,如果再改良的話,其實可以用陣列寫,不過這又是另一回事了

波動拳,對....就是龍跟肯的那種阿波砍,不用懷疑!!!

 		public function coverAction($fieldType,$coverData){
            switch ($fieldType) {
                case "name" :
                    $isChinese= preg_match("/^[\x7f-\xff]+$/",$coverData);
                    if($isChinese==1) {
                        $newCoverData = str_replace(mb_substr($coverData, 1, 1), "*" , $coverData);
                        return $newCoverData;
                    }elseif ($isChinese==0){
                        $newCoverData = str_replace(mb_substr($coverData, 1, 3), "***" , $coverData);
                        return $newCoverData;
                    }
                    break;

                case "address" :
                    $newCoverData = str_replace(mb_substr($coverData, 3, 100), "*****************									***" , $coverData);
                    return $newCoverData;
            }
        }

以上方法第一個變數需傳入要遮罩的欄位是屬於什麼類型,

第二個需傳入要遮罩的資料,內容就是如果是姓名,判斷是否為中文,再去切割字串並用*替代,地址就純粹切割字串然後用米字號替代

接著,假設我們在一個Action裡透過從建構子呼叫來使用這個Service

class TestCoverController extends AbstractController(){

 	private $service;

	 public function __construct(CoverServcie $service)
    {
        $this->service = $service;
       
    }
    
    
     /**
     * @Route(
     *     "/route",
     *     name="route"
     * )
     */
     public function testRoute (){
     	$data="黃小敏";
     	
     	$dataAfterCover=$this->service->coverAction("name",$data);
     	
     
     }
    

}

這樣一來$dataAfterCover就會是遮罩過後的樣子了,如下圖 ↓

好啦~以上是關於Service的簡單介紹,
下一篇要來介紹的是parameter 參數的設定及使用,還有環境設定,和實體類Entity,
其實老實說.....我一直覺得Entity不就是java裡面說的java bean嗎 !!?


上一篇
Day#2 看路牌指標才不會走錯路之路由(Route)介紹及抓蟲用的捕蟲網(toolBar)
下一篇
Day#4 會重工的東西來一遍就好了,不要一直跟牛魔王出來看上帝-Parameter參數
系列文
PHP框架-Symfony4 + api platform 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言