用 TDD 的方式為 Laravel 開發擴充套件

wkan發表於2020-05-04

起因

最近在做一些 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

原文連結 laravel.pro/threads/6

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Laravel YES !

相關文章