laravel - huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07...

106
從學徒變師 Laravel 框架擴充與套件開發 范聖佑 (Shengyou Fan) PHPCon China 2016 2016/06/26

Upload: others

Post on 16-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

從學徒變⼤大師談 Laravel 框架擴充與套件開發

范聖佑 (Shengyou Fan)PHPCon China 2016

2016/06/26

Page 2: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

{          "name":  "shengyou/self-­‐introduction",          "description":  "⾃自我介紹",          "authors":  [                  {                          "name":  "范聖佑  (Shengyou  Fan)",                          "email":  "[email protected]",                          "homepage":  "http://www.shengyoufan.com",                          "role":  ["Researcher",  "Evangelist"]                  }          ],          "support":  {                  "facebook":  "http://fb.me/shengyoufan",                  "twitter":  "@shengyou",                  "wechat":  "@shengyoufan"          }  }

Page 3: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

v2.2 v4.0  ~  v5.2

Page Script

5.3

探索歷程

Page 4: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

依賴 Composer初始化、安裝、更新全靠它尤其是 autoloading!

Page 5: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

全⾯面遵循 PSR包括 PSR 1、PSR 2、PSR 4

★ 官⽅方⽂文件:https://laravel.com/docs/5.2/contributions#coding-style

Page 6: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

不⽌止是框架更是完整流程

Route MVC

ScheduleQueue

Mail

Testing

Validation

從開發環境、內建元件、測試部署⼀一條⻯⿓龍的完整框架

Cache

Session

Forge

Envoyer

Homestead Valet

Page 7: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

內建元件+

外掛套件你所需要的都有

★ http://packalyst.com

★ https://socialiteproviders.github.io

Page 8: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laravel 台灣https://www.facebook.com/groups/laravel.tw

成⽴立於 2013 現有 3600 位成員加⼊入

Page 9: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laravel 道場http://www.laravel-dojo.com

致⼒力於提供最好的 Laravel 教育訓練

Page 10: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

2016.03正修科⼤大資⼯工系

2016.01中華電信學院

2015.07新北市樹林國⼩小

2014.12彰師⼤大資⼯工系

2015.05臺中科⼤大資⼯工系

2015.12⻁虎尾科⼤大電算中⼼心

2016.02交通⼤大學資服中⼼心

Page 11: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

推廣了近三年,最常聽到的回應是…

Page 12: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laravel 看起來好像不錯 但…

但…

ButBut…

But…

Page 13: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

導⼊入框架的疑慮

會不會被框架綁死?框架會持續維護嗎?

有辦法跟現有專案整合嗎? 會不會很難改啊?有辦法擴充嗎?

Page 14: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laravel: From Apprentice To Artisan

https://leanpub.com/laravel

框架作者 Taylor Otwell 親⾃自撰寫說明核⼼心架構及框架擴充

從學徒變⼤大師

Page 15: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

核⼼心機制

Page 16: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

範例情境• 使⽤用者在網站上註冊,註冊完會發⼀一封通知簡訊• 使⽤用 Nexmo 簡訊寄送服務

Page 17: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register()          {                  //  ...  

               //  寄送簡訊                                  

               //  ...          }  }

Page 18: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register()          {                  //  ...  

               //  寄送簡訊                  $nexmoSender  =  new  NexmoSender();                  

               //  ...          }  }

Page 19: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register()          {                  //  ...  

               //  寄送簡訊                  $nexmoSender  =  new  NexmoSender();                  $nexmoSender-­‐>send('{PHONE}',  '{MESSAGE}');  

               //  ...          }  }

Page 20: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register()          {                  //  ...  

               //  寄送簡訊                  $nexmoSender  =  new  NexmoSender();                  $nexmoSender-­‐>send('{PHONE}',  '{MESSAGE}');  

               //  ...          }  }

NexmoSender 和 UsersController 綁得太緊

Page 21: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Dependency Injection依賴注⼊入

Page 22: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          

       public  function  __construct()          {                          }  

       public  function  register()          {                  //  ...                  $nexmoSender  =  new  NexmoSender();                  $nexmoSender-­‐>send('{PHONE}',  ‘{MESSAGE}');                  //  ...          }  }

Page 23: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          

       public  function  __construct(NexmoSender  $smsSender)          {                          }  

       public  function  register()          {                  //  ...                  $nexmoSender  =  new  NexmoSender();                  $nexmoSender-­‐>send('{PHONE}',  ‘{MESSAGE}');                  //  ...          }  }

Page 24: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register()          {                  //  ...                  $nexmoSender  =  new  NexmoSender();                  $nexmoSender-­‐>send('{PHONE}',  ‘{MESSAGE}');                  //  ...          }  }

Page 25: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register()          {                  //  ...                  $nexmoSender  =  new  NexmoSender();                  $nexmoSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 26: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register()          {                  //  ...                  $nexmoSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 27: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register()          {                  //  ...                  $this-­‐>smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 28: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

覺得很囉嗦?Laravel 有⼀一招更簡單的!

Page 29: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register()          {                  //  ...                  $this-­‐>smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 30: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register(NexmoSender  $smsSender)          {                  //  ...                  $this-­‐>smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 31: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register(NexmoSender  $smsSender)          {                  //  ...                  $this-­‐>smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 32: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          protected  $smsSender;  

       public  function  __construct(NexmoSender  $smsSender)          {                  $this-­‐>smsSender  =  $smsSender;          }  

       public  function  register(NexmoSender  $smsSender)          {                  //  ...                  $smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 33: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {        public  function  register(NexmoSender  $smsSender)          {                  //  ...                  $smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 34: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

怎麼辦到的?

Page 35: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

IoC ContainerIoC 容器

Page 36: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laravel 的 Service Container1.⺫⽬目前的 type hinting 有註冊任何綁定嗎?

class  UsersController  extends  Controller  {          public  function  register(NexmoSender  $smsSender)          {                  //  ...          }  }

Container

NexmoSender::class  =>  ?

Page 37: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

1.⺫⽬目前的 type hinting 有註冊任何綁定嗎?

2.沒有?試著 Reflect 這個 Class,以及其相依 (遞迴)

Laravel 的 Service Container

class  UsersController  extends  Controller  {          public  function  register(NexmoSender  $smsSender)          {                  //  ...          }  } new  RefectionClass('NexmoSender');

Containernew  NexmoSender(params);

Page 38: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

狀況題:需求變更• 業務需求變更,要換簡訊服務商  • 改⽤用  Twilio  簡訊寄送服務

Page 39: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(NexmoSender  $smsSender)          {                  //  ...                  $smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 40: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(TwilioSender  $smsSender)          {                  //  ...                  $smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 41: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(TwilioSender  $smsSender)          {                  //  ...                  $smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 42: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(TwilioSender  $smsSender)          {                  //  ...                  $smsSender-­‐>phone('{PHONE}');                  $smsSender-­‐>message('{MESSAGE}');                  $smsSender-­‐>call();                  //  ...          }  }

Page 43: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(TwilioSender  $smsSender)          {                  //  ...                  $smsSender-­‐>phone('{PHONE}');                  $smsSender-­‐>message('{MESSAGE}');                  $smsSender-­‐>call();                  //  ...          }  } 只要每次有需求變更,就得修改對應的程式碼!

Page 44: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

透過建⽴立 Interface讓寄送簡訊的動作變得⼀一致

Page 45: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

建⽴立契約1.將寄發簡訊的動作抽象成⼀一個 Interface

Page 46: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Contracts/SmsSenderContract.php  interface  SmsSenderContract  {          public  function  send($phoneNumber,  $message);  }

宣告 SmsSenderContract 並定義 methods

Page 47: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

建⽴立契約1.將寄發簡訊的動作抽象成⼀一個 Interface

2.寄送簡訊的 Class 都要實作 Interface

Page 48: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Libraries/NexmoSender.php  class  NexmoSender  {                                        }  

//  app/Libraries/TwilioSender.php  class  TwilioSender  {                            }

Page 49: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Libraries/NexmoSender.php  class  NexmoSender  implements  SmsSenderContract  {          public  function  send($phoneNumber,  $message)          {                  //  ...          }  }  

//  app/Libraries/TwilioSender.php  class  TwilioSender  implements  SmsSenderContract  {          public  function  send($phoneNumber,  $message)          {                  //  ...          }  } Sender 實作 SmsSenderContract 及其 methods

Page 50: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

建⽴立契約1.將寄發簡訊的動作抽象成⼀一個 Interface

2.寄送簡訊的 Class 都要實作 Interface

3. Controller 的 type hinting 改成 Interface

Page 51: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(TwilioSender  $smsSender)          {                  //  ...                  $smsSender-­‐>phone('{PHONE}');                  $smsSender-­‐>message('{MESSAGE}');                  $smsSender-­‐>call();                  //  ...          }  }

修改 type hinting

Page 52: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(SmsSenderContract  $smsSender)          {                  //  ...                  $smsSender-­‐>phone('{PHONE}');                  $smsSender-­‐>message('{MESSAGE}');                  $smsSender-­‐>call();                  //  ...          }  }

Page 53: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(SmsSenderContract  $smsSender)          {                  //  ...                  $smsSender-­‐>phone('{PHONE}');                  $smsSender-­‐>message('{MESSAGE}');                  $smsSender-­‐>call();                  //  ...          }  }

改⽤用 Interface 定義的 methods

Page 54: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Http/Controllers/UsersController.php  class  UsersController  extends  Controller  {          public  function  register(SmsSenderContract  $smsSender)          {                  //  ...                  $smsSender-­‐>send('{PHONE}',  '{MESSAGE}');                  //  ...          }  }

Page 55: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

照著這樣的架構寫 結果出錯了?

因為 Interface 還未綁定 Class

Page 56: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Service Provider服務提供者

Page 57: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Client

由 Service Provider 組合⽽而成

index.php

Laravel

的應⽤用程式架構

initializing

Page 58: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  config/app.php  'providers'  =>  [          /*            *  Laravel  Framework  Service  Providers...            */          //  ...          Illuminate\Mail\MailServiceProvider::class,          Illuminate\Queue\QueueServiceProvider::class,          Illuminate\View\ViewServiceProvider::class,                              /*            *  Application  Service  Providers...            */          App\Providers\AppServiceProvider::class,          App\Providers\AuthServiceProvider::class,          App\Providers\EventServiceProvider::class,          App\Providers\RouteServiceProvider::class,  ],

Page 59: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

實作 SmsServiceProvider1.建⽴立 SmsServiceProvider.php

Page 60: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

$  php  artisan  make:provider  SmsServiceProvider

Page 61: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

實作 SmsServiceProvider1.建⽴立 SmsServiceProvider.php

2.在 SmsServiceProvider 裡註冊綁定、解決相依

Page 62: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Providers/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                                                          }  }

Page 63: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Providers/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                  $this-­‐>app-­‐>bind(                                          );          }  }

Page 64: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Providers/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                  $this-­‐>app-­‐>bind(                          SmsSenderContract::class                  );          }  }

Interface 定義

Page 65: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Providers/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                  $this-­‐>app-­‐>bind(                          SmsSenderContract::class,  NexmoSender::class                  );          }  }

Interface 定義 綁定的 Class

Page 66: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Class 的相依參數怎麼處理?

Page 67: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Providers/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                  $this-­‐>app-­‐>bind(                          SmsSenderContract::class,  NexmoSender::class                  );          }  }

Page 68: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Providers/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                  $this-­‐>app-­‐>bind(                          SmsSenderContract::class,  function()  {                          return  new  NexmoSender('{API_KEY}',  '{API_SECRET}');                  });          }  }

第⼆二個參數改成 Closure,在 Closure 內處理

Page 69: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

實作 SmsServiceProvider1.建⽴立 SmsServiceProvider.php

2.在 SmsServiceProvider 裡註冊綁定、解決相依

3.在 app.php 裡啟動 SmsServiceProvider

Page 70: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  config/app.php  'providers'  =>  [  

       /*            *  Laravel  Framework  Service  Providers...            */          //  ...          Illuminate\Session\SessionServiceProvider::class,  

       App\Providers\SmsServiceProvider::class,                              /*            *  Application  Service  Providers...            */          App\Providers\AppServiceProvider::class,          //  ...  

],

Page 71: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

聽說你寫了發送簡訊的功能,沒問題!

我的專案也能⽤用嗎?包成套件給你

Page 72: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

擴充套件

Page 73: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

發佈套件1.建⽴立 Composer 套件結構

Page 74: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laravel 專案 SMS Package

src

Contracts

SmsSenderContract.php

Senders

NexmoSender.php

SmsServiceProvider.php

composer.json

app

Contracts

Libraries

NexmoSender.php

SmsSenderContract.php

Providers

SmsServiceProvider.php

laravel sms-pkg

Page 75: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

發佈套件1.建⽴立 Composer 套件結構

2.設定套件的 composer.json

Page 76: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  composer.json  {          "name":  "vendor/sms-­‐pkg",          "require":  {                  "php":  ">=5.5.9",                  "illuminate/support":  "5.2.*"          },          "autoload":  {                  "psr-­‐4":  {                          "MyNamespace\\Sms\\":  "src"                  }          }  }SMS Package

Page 77: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

發佈套件1.建⽴立 Composer 套件結構

2.設定套件的 composer.json

3.選擇發佈套件的⽅方式

Page 78: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

發佈管道• 公開發佈

- 將程式碼放置在 Github 上- 在 Packagist 上註冊套件資訊

• 私密使⽤用- 將程式碼放置在私有版本控制系統上- 架設 Satis 或 Toran Proxy★ 參考:http://www.slideshare.net/shengyou/modern-web-conf-2015-php-composer

★ 參考:http://oomusou.io/laravel/laravel-package-hello-world/

Page 79: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

怎麼安裝?搞定!可以使⽤用了

Page 80: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

安裝套件1.設定專案的 composer.json

Page 81: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laravel 專案

//  composer.json  {          "name":  "vendor/myproject",          "require":  {                  "php":  ">=5.5.9",                  "laravel/framework":  "5.2.*",                  "vendor/sms-­‐pkg":  "dev-­‐master"          },          "repositories":  [                  {                          "type":  "path",                          "url":  "../sms-­‐pkg"                  }          ],  }依 repositories 現況設定 type 及 url

Page 82: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

安裝套件1.設定專案的 composer.json

2.使⽤用 Composer 更新相依套件

Page 83: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

$  composer  update

Page 84: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

安裝套件1.設定專案的 composer.json

2.使⽤用 Composer 更新相依套件

3.設定專案 config/app.php 內的 providers 陣列

Page 85: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  config/app.php  'providers'  =>  [  

       /*            *  Laravel  Framework  Service  Providers...            */          //...          Illuminate\Session\SessionServiceProvider::class,  

       MyNamespace\Providers\SmsServiceProvider::class,                              /*            *  Application  Service  Providers...            */          App\Providers\AppServiceProvider::class,          //  ...  

],

Page 86: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

讚啦!Ta-da!

也給我⼀一份!

Page 87: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

主題總結

Page 88: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

今⽇日討論主題

特⾊色綜覽依賴 Composer

全⾯面遵循 PSR

⼀一條⻯⿓龍⽅方案完整⽣生態系

核⼼心機制Dependency Injection

IoC Container

Service Provider

套件開發套件結構

設定 composer.json

發佈套件安裝套件

Page 89: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Too much Java?少⼀一點套路、多⼀一點真誠?

Page 90: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

隨機應變⼀一切都跟需求有關

Page 91: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

更容易了解別⼈人的套件原理

好處1

Page 92: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

⾮非同步開發好測試、好分⼯工

好處2

Page 93: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Libraries/DummySender.php  class  DummySender  implements  SmsSenderContract  {          public  function  send()          {                  //  模擬或假裝有送出簡訊          }  }

Page 94: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Services/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                  $this-­‐>app-­‐>bind(                          SmsSenderContract::class,  function()  {                          return  new  NexmoSender('{API_KEY}',  '{API_SECRET}');                  });          }  }

Page 95: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  app/Services/SmsServiceProvider.php  class  SmsServiceProvider  extends  ServiceProvider  {          public  function  register()          {                  $this-­‐>app-­‐>bind(                          SmsSenderContract::class,  function()  {                          return  new  DummySender();                  });          }  }

還沒正式接上簡訊系統前 先做⼀一個假的讓程式可以運作

Page 96: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

//  tests/ExampleTest.php  class  ExampleTest  extends  TestCase  {          public  function  testUsersControllerSendSms()          {                  //  Arrange                  $smsSender  =  Mockery::mock(SmsSenderContract::class);                  $smsSender-­‐>shouldReceive('send')-­‐>once();  //  Assert                  app()-­‐>instance(SmsSenderContract::class,  $smsSender);                            //  Act                  $this-­‐>action('POST',  'UsersController@register');          }  } 使⽤用 Interface 好 Mock、好測試

Page 97: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

隨⼼心所欲抽換內建元件

好處3

Page 98: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

⼀一切照合約⾛走

Laravel Contracts要抽換元件時,只要該元件有實作 Interface,在 IoC 裡抽換綁定就可以了

★ 官⽅方⽂文件:https://laravel.com/docs/5.2/contracts#how-to-use-contracts

Page 99: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

更換樣板引擎?• ytake/laravel-­‐smarty

- 將 Smarty 樣板引擎整合⾄至 Laravel

• rcrowe/twigbridge

- 將 Twig 樣板引擎整合⾄至 Laravel

★ 參考:https://github.com/ytake/Laravel.Smarty

★ 參考:https://github.com/rcrowe/TwigBridge

Page 100: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

⼯工商服務歡迎⼤大家來台灣玩!

Page 101: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

PHPConf Taiwan 2016年度 PHP 盛會,將於 2016/10/29 舉辦

Page 102: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

PHP 也有 Day每⽉月舉辦⼀一次的 PHP 講座型聚會

Page 103: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laradiner每⽉月舉辦⼀一次的 Laravel 讀書會

Page 104: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Laradebut每⽉月舉辦⼀一次的 Laravel 新⼿手村

Page 105: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Vuediner與友團合辦的 Vue.js 讀書會

Page 106: Laravel - Huodongjia.com · 2016.03 正修科資系 2016.01 中華電信學院 2015.07 新北市樹林國 2014.12 彰師資系 2015.05 臺中科 資系 2015.12 尾科電算中 2016.02

Q & A

感謝聆聽.歡迎交流