用發展的眼光線追蹤技術

本文從 PHP 語言的 YII2 框架說起,簡單談一些技術的演變和發展脈絡。

YII2 這個框架是 PHP 語言生態下的一款 Web 應用框架。有過 PHP 開發經驗的開發者都不會陌生,或多多少都聽說過,熟悉,至少接觸過。

回到始點 PHP 官方定位

「PHP is a popular general-purpose scripting language that is especially suited to web development

PHP 官方的定義是基於輕型的 Web 應用,最典型的應用是 MVC。

YII2 初來乍到

在 2013 年,2014 年 YII2 剛剛發布的年份,YII2 被大家追逐的原因大概是面向對象數據,包載入的擴展屬性,自帶 Gii 自動化生成工具,清爽的 View 介面和工具包,API 序列化模型這幾個。

我們返回頭再整體回顧下 YII2 框架,你會發現在 YII2 官方的默認模版中,View 層還是佔有很大的比重。

最近幾年,前端技術演進迅猛,Web 開發都在使用前後端分離,分離大部分內容是數據的業務控制和介面的顯示。

View 逐漸被前端框架,如 Vue 取代,YII2 也暴露出來它的劣勢。

在 YII2 社區中安裝 YII2 版本的討論中,經常有一個 View asset 擴展安裝的難題,核心就是前端頁面元素與後端服務的耦合的問題,以及版本依賴的衝突。

參考文檔 composer 管理 js css 等依賴文件[1]

相關命令

composer global require "fxp/composer-asset-plugin:*"

使用 YII2 構建 API

簡單概括

「現在我們使用 YII2,就是在使用它構建 API 的能力。

看一看 YII2 官方文檔[2] 列出來的 YII2 關鍵組成,基本上很多已經退出常見的使用場景。

找到了一個介紹 YII2 微框架,為服務介面而設計的 使用 Yii 作為微框架[3]

YII2微框架.png

YII2 去掉預置的模版,去掉 View 功能,剩下的核心也就是這個了。

PHP 可擴展性

關於 YII2 這款框架,有兩個概念值得說明一下

「組件和模組

.YII2 的擴展性主要體現在組件(comments)的設計上

'components' => [          'request' => [              'cookieValidationKey' => 'dmpisthebest',              'parsers' => [                 'application/json' => 'yiiwebJsonParser',              ]          ],          'cache' => [              'class' => 'yiicachingFileCache',          ],          'errorHandler' => [              'errorAction' => 'site/error',          ],          'user' => [              'identityClass' => '',              'enableAutoLogin' => false,          ],  ]

YII2 種常見的組件 包括 user,seesion redis mongodb,log 等

感覺組件更適合做 infrastructure 的構建,而 module 則適合做業務的分離解耦

配置 YII2 帶來的耦合性

我們簡單分析 YII2 的主配置文件,很容易了解到 YII2 是通過模組(module),組件(components)來啟動和項目功能的。 必須的模組和組件自動載入,其它組件和模組可以按需載入。雖然組件和模組為擴展性提供了便利,引用它們使用的配置,會造成入口 index.php 自動載入的 main.php 文件複雜臃腫,難以維護和閱讀。

解決耦合可以從以下幾個方面的嘗試

「根據環境分拆配置文件

根據環境,載入不同的文件,可以 通過域名,變數等方式確定環境,進而分離配置文件。

YII2 入口文件及環境配置.png

根據組件分拆配置文件,實現組件和模組的按需載入。

複製優於依賴

「Alittle copyiing is better than a litter dependcy

有時候不一定要優先追求共享程式碼,應該有一部分複製冗餘。公用代表著多處使用,和依賴耦合。複製雖然增加了複製的成本,卻獨立自由。

怎麼理解這句話?

我們以 YII2 工程為例,官方推薦的 Advanced 模版中有一個公共工程 common

那我們是不是應該把項目中可以共用的數據層都放到 common 里?

YII2-模組.png

如上圖,passport 和 admin 兩個模組,如果都涉及同一張 User 表,依據複製優於依賴的原則,沒有必要公用一個 User 類,可以單獨存放為兩個 User 類,用命名空間做隔離。更何況因為模組不一樣,即使同一個數據表對象,相關的數據操作也會不一樣。

  /**       * @inheritdoc       */      public function init()      {          if (!$this->accountId)              throw new InvalidConfigException('accountId required.');          if (!$this->secretKey)              throw new InvalidConfigException('secretKey required.');      }

PHP 如何做單元測試

這個可以作為一個面試題與候選者溝通,但是我下邊這段話,不適合作為答案。

當然會有一些單元測試組件,比如 YII2 下的 Codeception,PHPUnit 進行數據 Mock。可實際情況呢,程式直接用 var_dump,REST 介面測試程式即可調試,達到單元測試的目的。

這就是 最簡單的理論和實際的出入,理論結合實踐的實話。

總結

看看程式語言的發展脈絡,以及前後端發展的變革,可以總結出兩個詞:演變和趨勢。在應用程式開發中,前端這個職位是從後端細化和演變而來的,前後端分離和獨立就是技術的趨勢。 首先技術層面的技術選擇和生態,其次職位的前端工程師和後端工程師區分,在者部門的設立原則前端部門和後端部門。

改變思路.png

演變代表著萬變不離其宗,趨勢代表著先進的技術就是先進的生產力。 本來想寫一篇關於重新定位 YII2 的文章,最後發現本文的重點其實不是 YII2 ,而是這種變化趨勢對於相關決策的度量參考。 唯有改變思路,才有出路,用發展的眼光去追技術。

參考資料

[1]

composer 管理 js css 等依賴文件: https://www.zhaokeli.com/article/8522.html

[2]

YII2 官方文檔: https://www.yiichina.com/doc/guide/2.0

[3]

使用 Yii 作為微框架: https://www.yiichina.com/doc/guide/2.0/tutorial-yii-as-micro-framework