當你接手一個新項目的時候,可能會感到無從下手,若是不熟悉編程,則更是如此。那麼,咱們該從哪兒入手呢?項目代碼的哪些部分咱們須要着重瞭解?下面咱們看看 Laravel 項目的幾個通用的部分。php
面對新項目時,文檔多是最有幫助的。若是項目包含文檔,恭喜你,你很是幸運。可是,也別高興地太早,由於文檔可能早已通過時或覆蓋不全面。項目文檔一般編寫在 readme
文件中、wiki,或者發佈在 Confluence 和 Google Docs 之類共享平臺上。若是你基於一個項目作開發,不要猶如,請積極的爲項目文檔作貢獻:補充空白部分或者使其表達得更清晰明瞭。laravel
若是你不夠幸運的話(大多數時候都是如此),你接觸的項目沒有任何文檔。缺乏文檔並不徹底是一件壞事,由於在這種狀況下,你有機會親自爲你的團隊撰寫文檔。你和你的同事,以及你帶來的新開發者,都將會在將來對你感激涕零。數據庫
撰寫文檔確實不是一件有趣的工做,但它對於保持項目的長期運行是頗有必要的。項目文檔不只要列舉使用的技術和初始安裝方法,同時也應該闡述項目 「爲何這樣」 以及 「如何進行」 ,這一般不能清晰地用代碼自身表達出來。某些高層次的設計選擇及其緣由也應該被寫入文檔,以幫助更好地理解代碼。編程
Composer 是一個 PHP 包管理工具,在過去的幾年中幫助推進了 PHP 生態系統的快速前進。 Laravel 從版本4開始使用 Composer ,因此在項目基本都存在 composer.json
文件。你可以在項目根目錄下找到 composer.json
文件和 composer.lock
文件。json
lock 文件包含了項目中所須要的全部依賴包的準確版本,而 JSON 文件顯示了依賴包的發佈內容。目前,咱們只對 JSON 文件中的版本信息感興趣,若是你想學習這些文件的更多知識,能夠閱讀 這裏。api
在瀏覽 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}
,以下這種連接 https://laravel.com/docs/5.6>...。閉包
文檔 docs
對 laravel 功能及各個主要部分的工做原理做了比較全面的介紹。同時 api
文檔將 laravel 框架中所用到的類及方法以清單的形式呈現出來。app
在查看了 Laravel 文檔以後,能夠繼續查看其它依賴的文檔。你能夠前往 Packagist (這是 Composer 所使用的擴展包倉庫)獲取關於依賴的更多信息,各擴展對應的地址爲https://packagist.org/packages/{VENDOR}/{PACKAGE}
,好比 https://packagist.org/package...。
在每個 Packagist 的項目主頁上,展現了擴展包的介紹、版本號、倉庫地址(如 GitHub)、完整的 readme
文件,以及其餘一些有用的信息。從項目主頁上得到的信息足夠使你瞭解這個擴展包是什麼,在你的項目中又承擔哪部分功能。經過這種方式,繼續去了解你項目應用的 composer.json
文件中所羅列出的其餘依賴。
路由是應用某個具體功能的入口。路由表現爲一個連接,瀏覽器訪問連接時,最終由綁定的控制器或閉包來處理。由路由找到具體對應的控制器,就能清楚控制器所依賴的其餘模塊以及實現的具體功能。遇到新的路由,繼續重複這一動做,就能逐步搞清楚整個應用是怎麼工做的。
你能夠在項目的以下位置找到路由配置文件:
routes/*.php
app/Http/routes.php
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}/edit
的內容,這是找不到的,由於它的定義是做爲 Route::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。
討論請前往 Laravel 知識社區: https://laravel-china.org/top...