當你接手一個新專案的時候,可能會感到無從下手,如果不熟悉程式設計,則更是如此。那麼,我們該從哪兒入手呢?專案程式碼的哪些部分我們需要著重瞭解?下面我們看看 Laravel 專案的幾個通用的部分。
專案文件
面對新專案時,文件可能是最有幫助的。如果專案包含文件,恭喜你,你非常幸運。但是,也別高興地太早,因為文件可能早已經過時或覆蓋不全面。專案文件通常編寫在 readme
檔案中、wiki,或者釋出在 Confluence 和 Google Docs 之類共享平臺上。如果你基於一個專案做開發,不要猶如,請積極的為專案文件做貢獻:補充空白部分或者使其表達得更清晰明瞭。
如果你不夠幸運的話(大多數時候都是如此),你接觸的專案沒有任何文件。缺少文件並不完全是一件壞事,因為在這種情況下,你有機會親自為你的團隊撰寫文件。你和你的同事,以及你帶來的新開發者,都將會在未來對你感激不盡。
撰寫文件確實不是一件有趣的工作,但它對於保持專案的長期執行是很有必要的。專案文件不僅要列舉使用的技術和初始安裝方法,同時也應該闡述專案 “為什麼這樣” 以及 “如何進行” ,這通常不能清晰地用程式碼自身表達出來。某些高層次的設計選擇及其原因也應該被寫入文件,以幫助更好地理解程式碼。
composer.json
Composer
是一個 PHP 包管理工具,在過去的幾年中幫助推動了 PHP 生態系統的快速前進。 Laravel 從版本4開始使用 Composer ,所以在專案基本都存在 composer.json
檔案。你能夠在專案根目錄下找到 composer.json
檔案和 composer.lock
檔案。
lock 檔案包含了專案中所需要的所有依賴包的準確版本,而 JSON 檔案顯示了依賴包的釋出內容。目前,我們只對 JSON 檔案中的版本資訊感興趣,如果你想學習這些檔案的更多知識,可以閱讀 這裡。
在瀏覽 composer.json
檔案時,注意到有一個 require
區塊,看起來內容類似如下所示。
{
"require": {
"php": ">
=7.1.3", "fideloper/proxy": "~4.0", "laravel/framework": "5.6.*", "laravel/tinker": "~1.0"
}
}複製程式碼
在這個樣例中,我們有一個基於 Laravel 5.6 的專案。它同時依賴於另外兩個包,以及不低於7.1.3版本的 PHP 。在你的專案中,你很可能會看到更多依賴包,並且版本號可能會有所變化。
現在你知道了專案中依賴了哪些擴充套件包,去搞明白它們各自的功能。我推薦從 Laravel 依賴開始,因為它們擁有詳細的文件。且文件就釋出在網路上,很容易就能找到:https://laravel.com/docs/{VERSION
}
和 https://laravel.com/api/{VERSION
,如下這種連結 laravel.com/docs/5.6
}
和
laravel.com/api/5.6。
文件 docs
對 laravel 功能及各個主要部分的工作原理作了比較全面的介紹。同時 api
文件將 laravel 框架中所用到的類及方法以清單的形式呈現出來。
在檢視了 Laravel 文件之後,可以繼續檢視其它依賴的文件。你可以前往 Packagist
(這是 Composer 所使用的擴充套件包倉庫)獲取關於依賴的更多資訊,各擴充套件對應的地址為https://packagist.org/packages/{VENDOR
,比如 packagist.org/packages/fi…。
}/{PACKAGE
}
在每一個 Packagist 的專案主頁上,展示了擴充套件包的介紹、版本號、倉庫地址(如 GitHub)、完整的 readme
檔案,以及其他一些有用的資訊。從專案主頁上獲得的資訊足夠使你瞭解這個擴充套件包是什麼,在你的專案中又承擔哪部分功能。通過這種方式,繼續去了解你專案應用的 composer.json
檔案中所羅列出的其他依賴。
路由
路由是應用某個具體功能的入口。路由表現為一個連結,瀏覽器訪問連結時,最終由繫結的控制器或閉包來處理。由路由找到具體對應的控制器,就能清楚控制器所依賴的其他模組以及實現的具體功能。遇到新的路由,繼續重複這一動作,就能逐步搞清楚整個應用是怎麼工作的。
你可以在專案的如下位置找到路由配置檔案:
- Laravel 5.3+
routes/*.php
- Laravel 5.0-5.2
app/Http/routes.php
- Laravel 4.2
app/routes.php
路由 “陷阱”
某些時候,根據具體 URL 定位路由需要費些腦子。
比如 URI /users/123/profile
。你可能想要去搜尋 users/{id
的路由定義。事實上,它是定義在
}/profile
路由分組
中,這使得路由比較難定位。
Route::prefix('users')->
group(function () {
Route::get('{id
}/profile', 'UsersController@profile');
});
複製程式碼
在這個例子中,users
和 {id
}/profile
並沒有被寫在一起,這是難以定位的原因。如果路由不多,還能比較輕易的找出。但是,當路由檔案有成百上千條定義時,這將會變得非常困難。
另外一個坑是 Route::resource()
(還有新版本中的 Route::apiResource()
)。
Route::resource()
將自動根據指定引數生成路由。舉個例子,在路由檔案中新增程式碼 Route::resource('dogs', 'DogController');
將完成與下述程式碼相同的功能。
Route::group(['prefix' =>
'dogs'], function () {
Route::get('/', 'DogsController@index')->
name('dogs.index');
Route::get('create', 'DogsController@create')->
name('dogs.create');
Route::post('/', 'DogsController@store')->
name('dogs.store');
Route::get('{id
}', 'DogsController@show')->
name('dogs.show');
Route::get('{id
}/edit', 'DogsController@edit')->
name('dogs.edit');
Route::put('{id
}', 'DogsController@update')->
name('dogs.update');
Route::delete('{id
}', 'DogsController@destroy')->
name('dogs.destroy');
});
複製程式碼
然而,如果你嘗試查詢類似 dogs/{id
的內容,這是找不到的,因為它的定義是作為
}/editRoute::resource()
的其中一部分。
有時通過 Route::resource()
方式直接定義路由是挺方便的,但我更傾向於單獨地定義每一個路由,這樣能使每個 URI 更容易被直接搜尋到。瞭解更多路由資源和資源控制器的相關資訊,可以查閱這些 文件 。
預覽專案中的所有路由的最簡單方式是使用 artisan 命令 route:list
:
php artisan route:list複製程式碼
route:list
命令提供了每個路由的完整細節,包括 HTTP 請求方式,具體的 URI ,路由名稱,動作資訊(也就是控制器及其方法),以及為每個路由配置的中介軟體資訊。
服務提供者
服務提供者是 Laravel 釋放魔法之地。 官方文件 給出了總結:
服務提供者是所有 Laravel 應用程式引導中心。你的應用程式以及 Laravel 的所有核心服務都是通過服務提供器進行引導。
在這裡,我們說的「引導」其實是指註冊,比如註冊服務容器繫結、事件監聽器、中介軟體,甚至是路由的註冊。服務提供者是配置你應用程式的中心。
你可以瀏覽位於 app/providers
目錄下的所有應用程式服務提供者。圍繞應用自定義增加的相關程式碼,理應在這裡。例如,一些情況下要查詢檢視合成器,巨集,並做配置調整。
在舊版本的 Laravel 中,如 4.2,你會在 global.php 檔案中發現類似的功能,因為那時服務提供者通常只在包中使用。
測試
程式碼庫包含的測試套件能向你展示應用程式如何工作以及接下來的響應。對應用的邊界處理情況,它可以提供有價值的線索。當然,就像程式碼庫文件一樣,應用配套的測試檔案有可能不存在,或者很少,甚至是無用的過時檔案。
同寫專案文件一樣,寫應用配套測試同樣可以更好的學習專案應用,提升程式碼質量。你可能偶然發現並修復一些缺陷,移除無用的程式碼,或者為專案中重要的類新增測試覆蓋。
利器
對 Laravel 開發者而言,Barry vd. Heuvel 釋出的 Laravel Debugbar 是值得擁有的除錯和追溯工具。它功能強大,安裝便易。可以將應用程式中所發生的事情一覽無餘:經過的路由和控制器,資料庫查詢和執行時間,資料展示,異常,檢視執行內容和執行過程時間線等等。嘗試過使用這個包後,你將在之後的 Laravel 應用開發中對它愛不釋手。
尾聲
在這篇文章中,我提出了一些方法,方便你很快上手新的 Laravel 專案程式碼。這篇文章並非一份包含所有細節的清單,只是一個起步。我鼓勵你使用這些建議,看看它能把你帶到哪裡。如果您有任何交流的想法,我很樂意聽到它們!歡迎隨時聯絡
Twitter。
轉自 PHP / Laravel 開發者社群 laravel-china.org/topics/8897