起因
最近在做一些 TDD 開發的嘗試,由於需要一個比較通用的功能,所以打算做一個 Laravel 的擴充套件。現在做 Laravel 擴充套件的教程好像不多見,經過我的一番研究之後就有了這個教程。
至於我做的擴充套件包,那就以後再講,我們先來講講怎麼做擴充套件開發。
當然,我們要用 TDD 的方式來開發擴充套件。
關於 Laravel 擴充套件
擴充套件主要有兩種形式,一種是通用的 composer 包,這些擴充套件可以在任何框架裡使用,不限於 Laravel;另一種是 Laravel 專用的擴充套件包,只能在 Laravel 中使用。我們這裡要講的是後一種 Laravel 專用的擴充套件。
通過查閱官方文件關於擴充套件包開發的章節,我們可以瞭解到:擴充套件 Laravel 的主要方式是通過 ServiceProvider 。
那就直接上手吧!
建立專案
首先為擴充套件專案建立一個資料夾,然後在專案資料夾裡初始化 composer 專案:
composer init
接下來初始化程式會問你一些問題。
其中 Package Type 部分我們要選擇 library
。
當問到是否需要新增依賴時可以先輸入 no
,跳過互動式新增依賴。
然後我們來手動新增一些依賴包:
composer require --dev phpunit/phpunit
composer require --dev orchestra/testbench
phpunit
大家應該很熟悉了,是用來執行測試的。
orchestra/testbench
這個包是 TDD 開發擴充套件包的關鍵,它可以讓你在測試模擬 Laravel 框架的行為。通過這個包,我們就不用把擴充套件包放到實際的 Laravel 專案裡做測試了。
然後,我們要生成 phpunit 的配置檔案:
./vendor/bin/phpunit --generate-configuration
這裡可以直接使用預設的配置。
再在 composer.json
檔案裡設定 autoload :
+ "autoload": {
+ "psr-4": {
+ "My\\LaravelPackage\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "My\\LaravelPackage\\Tests\\": "tests/"
+ }
+ },
設定好後執行一下 compsoer dump-autoload
重新生成 autoload 檔案。
為擴充套件編寫測試
現在我們可以試著給擴充套件來寫一個測試,這裡期望我們的擴充套件可以給 Laravel 專案新增一個介面,這個介面返回擴充套件的名字:
// tests/ExampleTest.php
<?php
namespace My\LaravelPackage\Tests;
class ExampleTest extends \Orchestra\Testbench\TestCase {
protected function getPackageProviders($app)
{
return [LaravelPackageServiceProvider::class];
}
public function testApi()
{
$response = $this->getJson('/laravel-package/name');
$response->assertJson(['name' => 'laravel-package']);
}
}
測試中有兩個要點:
- 繼承
\Orchestra\Testbench\TestCase
類; - 新增
getPackageProviders
方法,返回擴充套件的ServiceProvider
類;
實現擴充套件
這裡執行測試,肯定是不通過的,不過我就不在這裡講 TDD 了,我們來看看實現後的擴充套件是什麼樣的。
別忘了實現 Laravel 擴充套件的方式是通過 ServiceProvider
,我們先來加上 LaravelPackageServiceProvider
:
// src/LaravelPackageServiceProvider.php
<?php
namespace My\LaravelPackage;
use Illuminate\Support\ServiceProvider;
class LaravelPackageServiceProvider extends ServiceProvider
{
public function boot()
{
$this->loadRoutesFrom(__DIR__.'/routes.php');
}
}
然後是路由檔案:
// src/route.php
<?php
Route::get('/laravel-package/name', function () {
return ['name' => 'laravel-package'];
});
路由就像標準的 Laravel 應用一樣寫。
這樣測試就可以通過了,不過這個擴充套件沒有實際用處。
關於更多測試的寫法可以參考 github.com/orchestral/testbench 。
本作品採用《CC 協議》,轉載必須註明作者和本文連結