[講座分享] Composer 從入門到實戰 (PHP 也有 Day #28)

有時候你會很驚訝,其實我們跟自己所使用的工具並不太熟!Composer 與 PHP 開發者的關係就是一個很好的例子…

楔子

在經營 PHP 社群活動及推廣 Laravel 時發現,雖然 Composer 已經是當代 PHP 開發的標準配備,不過許多 PHP 開發者卻對它一知半解,甚至有誤用的案例發生。所以我後來在教學課程裡,都增加了一段 Composer 的基礎教學。

不過,可能是因為單純的講解 Composer 太過單調枯燥,加上我的課程大多是以 Laravel 為教學主題。Composer 在搭配之下幾乎變成框架安裝工具,效果也沒有達到我當初設定的預期…

因此,這次有機會受邀到 PHP 也有 Day #28 跟大家分享 Composer 的議題時,我靈機一動,是不是能從 refactoring legacy code 的角度,讓聽眾能有機會對 Composer 有另一種全新的觀點?這次的講題內容就是在這樣的脈絡下誕生的:

講題內容

PHP 也有 Day #28 活動現場

所以在設計這個講題時,我打算先從一個模擬的 legacy code 開始,透過帶點酸味的揶揄,讓大家正視傳統 PHP 所謂 Page Script 寫法的問題。

接著,從最基礎的入門開始講,主要是要解除大家對 Composer 導入很難、Composer 很難裝、裝起來常常會有問題的誤解,並說明 json 檔、lock 檔及 install、update 等指令的差異。希望能把缺漏的基礎一次補足!

再來,我就直接火力展示,將 legacy 專案引入 Composer 套件生態系,讓大家知道 PHP 軍火庫的威力。這些套件都能很實際的解決開發上的常見問題,包括:

  1. 偵錯工具 (recca0120/laravel-tracy)
  2. 環境變數載入 (vlucas/phpdotenv)
  3. 資料庫管理 (robmorgan/phinx)
  4. 假資料產生器 (fzaninotto/faker)
  5. 日期時間處理 (nesbot/carbon)

最後的高潮,就是將原本不是 Composer 管理的那些 legacy code,用 Composer 的三大自動載入機制:psr-4、classmap、files 也一併統一管理,讓不論新舊程式碼都有一種萬法歸宗之感!

本次講座的 錄影投影片,我通通都上傳公開到對應的平台了,也直接嵌入在下方方便大家一邊看補課錄影帶、一邊對照投影片內容:

講題錄影
講題投影片

另外,值得一提的是,講座後我把講題內的示範重新整理過後,公開在 Laravel 道場的 Github 上 (https://github.com/laravel-dojo/20160922-php-the-day-demo)。在寫這個範例時,我特意將每一個動作都分別 commit,方便觀察每一個 baby step 做了什麼事情,希望對大家有所幫助!

還有更多

當然,在這次的示範裡因為時間和主題的關係,沒有辦法講更多,但其實還有許多可以改進的地方。就我目前的觀點,至少還可以做幾個部份,包括:

  1. 把所有對外的網頁搬進 public 資料夾,然後將 HTTP 伺服器的 Document Root 設定在 public。這樣整個應用程式的安全性會提高一些,也可以為接下來導入 Route 做準備。
  2. 可以將所有 DB 查詢的部份,改用任何一套你喜歡的 ORM 來寫。除了寫法更精簡/漂亮外,主要是可以防止自己手寫 SQL 語法時,可能會沒有擋好的 SQL Injection。
  3. 所有頁面顯示的部份,套用任何一套你喜歡的 Template Engine。我個人其實蠻喜歡 Twig 的,但若你之後打算改用 Laravel 的話,先套用 Blade 當然是首選。Blade 跟 Eloquent ORM 也有 Pagination 等的配套,相得益彰!

總結來說,就如同我在分享裡提到的:「當你學會並導入各式現代化做法後,你就要有這樣的信心,只要這份程式碼在你的手裡愈久,它應該就會往愈好的方向前進!(不需一步到位)」把那些一線的框架當做學習的目標,思考作者為什麼這樣做,然後模仿他;當我們準備好的時候,超越他!


同場加映

在講座的 QA 時,有一位朋友問了一個很好的問題:「假如如示範所講的,機敏資訊不應該放在程式碼版本管理裡的話,那 phinx.yml 這個檔案不就會發生一樣的結果?」的確,若照 phinx 的預設設定,當 phinx.yml 也進入版本管理時,一樣也會發生機敏資訊洩漏的問題。

好在 phinx 也不是沒想到這點,其實根據官方文件 (特別感謝 Mouson 幫我翻到官方文件的說明),只要把 phinx.yml 重新命名為 phinx.php,然後把 yml 原本的格式改成 PHP 的陣列,phinx 就會改讀 phinx.php 的設定值。而當我們可以使用 PHP 陣列時,就可以動態的讀取環境變數或常數了!

我在我示範檔的最後一個 commit 裡加了這個範例,其實就是把 phinx.yml 改成 phinx.php 後,加入下面這一段程式碼就搞定了!

改用 phinx.php 做為設定檔

Live Demo 經驗分享

第一次挑戰 Live Demo (其實在台上壓力超大!)

為了讓這次的分享能夠讓人真正「有感」,所以一開始就決定採用 Live Demo 的方式來進行,畢竟 Live Demo 的節奏感帶給聽眾的效果絕對是比較震憾的 (以往都很膽小的用預錄)。

實際上真的跑過一次後,總體來說效果不錯,不過中間幾個小地方略為出錯,想順道在這邊紀錄一下幾個點,下次要多留意,也提供給需要 Live Demo 的講者參考:

  1. 在 Live Demo 前,環境別忘了要清空初始化
    通常在 Live Demo 前,都會在自己的工作機練習數次,然後練習完就會很安心的把東西關一關,然後就忘了把所有做過的環境清空並初始化。導致實際在 Demo 時環境沒準備好,或是在開始前要聽眾等(看)你清空。打亂自己的節奏感事小;反而因此把聽眾的視線搞亂,不知道你在幹麻事大。不可不慎!
  2. 編輯器、Terminal 的佈影主題 (Theme) 要在簡報前根據現場投影機調整
    每一次簡報現場的投影機能力不同,有些投影機投影黑底白字適合、有些投影機則反之。我們開發者往往比較習慣黑底白字的佈影主題,但簡報現場卻不一定,記得早一點到現場測試;更好是平常就有針對兩種狀況準備好的簡報主題 (Presentation Theme)。
  3. 網路、網路、網路一定要穩
    這應該是所有 Live Demo 的致命傷!尤其像此次要 Demo Composer 安裝是絕對相依於網路的,中間就曾發生因網路中段而網頁出不來的狀況。所以,要嘛就是自己要先準備好網路 (4G 吃到飽),或是跟 4G 吃到飽的人借網路,而且前提是他不能聽到一半跑去廁所!(笑)
  4. Rundown 和 Snippet 的準備要更充份
    Live Demo 的重點就是節奏感,簡單來說就是要讓聽眾覺得:「哇!好帥!」所以 Rundown 一定要夠熟。因為平常開發你只需要打字而已,但 Live Demo 的時候你要同時打字、說明還要加搞笑帶氣氛,沒有練過的話一定會腦袋打結。另外,平常程式碼打錯還有時間慢慢偵錯,Live Demo 出錯時,所有人在等(幫)你偵錯的話就一整個氣勢弱掉了。所以我會建議先把每一個階段要示範的程式碼整理成 Snippet 先印出來放在旁邊,至少有個小抄可以看。這次分享其實我是有準備,也是練習不足所以還是發生程式碼打錯而中斷了數分鐘在除錯,甚為可惜!

工商服務

這一次分享 Composer 實戰的初衷,是因為這一段時間不少朋友來找我討論該怎麼幫 legacy code 改版,說到底大家都希望能現代化自己的專案,只是苦於找不到方法。因此,這場分享就是希望能提供給大家一個方向及起始點!

當然,假如您需要有人協助,不論是將 legacy code 現代化,或是導入 Laravel 的開發流程,我所在的公司:得寬科技,服務內容包含了承接 legacy code 的改寫或重寫成 Laravel;而我們團隊的教育訓練服務:Laravel 道場,除了開設完整的 PHP/Laravel 課程,也有提供顧問與教練服務歡迎與我們聯絡

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.