其實我們這樣子寫的方式,
感覺有點像在呼叫API,
所以我們決定要把它改成放到API,
我們把原本在web.php的內容刪掉,
然後新增一個APIController
php artisan make:controller API/APIController
檔案內容如下:
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
class APIController extends Controller
{
//
}
然後我們在routes/api.php
新增
Route::post('/getLeapYear/{year}', 'Api\APIController@checkLeapYear');
這種呼叫方式是傳統的方式,
但是Laravel 8不能直接這樣子用,
通常是建議用以下的方式
use App\Http\Controllers\API\APIController;
Route::post('/getLeapYear/{year}', [APIController::class, 'checkLeapYear']);
關鍵在於這個檔案
app/Providers/RouteServiceProvider.php
裡面的第29行被註解掉了
// protected $namespace = 'App\\Http\\Controllers';
把這行註解拿掉就可以使用舊的方式來呼叫了,
不過比較不傾向用這種方式,
所以我們之後都使用呼叫class的方式來寫.
然後我們在APIController.php裡面加入函式去呼叫GetLeapYear這個函式
function checkLeapYear($year)
{
$leap = GetLeapYear($year);
if($leap)
return "閏年";
return "平年";
}
我們的測試程式也要改一下MyFirstUnitTest.php
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
class MyFirstUnitTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
public function test_example()
{
$response = $this->get('/');
$response->assertStatus(200);
}
public function test_leapyear_return_200()
{
$response = $this->post('api/getLeapYear/0');
$response->assertStatus(200);
}
/**
* @param $input
* @param $output
* @dataProvider input_number
*/
public function test_leapyear_check_year($input, $output)
{
$response = $this->post("api/getLeapYear/$input");
$this->assertSame($output, $response->getContent());
}
public function input_number()
{
return [
['4', '閏年'],
['2020', '閏年'],
['1900', '平年'],
['2100', '平年'],
['2000', '閏年'],
['1600', '閏年'],
['2021', '平年'],
['2023', '平年'],
];
}
}
然後我們執行測試程式
php vendor/phpunit/phpunit/phpunit tests/Feature/MyFirstUnitTest.php
可以成功通過測資了。