2019-08-29 / JSN / 0 Comments / 1,442 次瀏覽
以 xdebug 為例,如果是在 windows ,例如使用 XAMPP 套件,可以參考官方網站這麼設定。
修改 php.ini 啟動 Xdebug
前往 Settings (Ctrl + Alt + S) > Languages & Frameworks > PHP 打開 php.ini
如果有以下,請把 Zend Debugger 和 Zend Optimizer 隱藏,也就是在前方加分號
|
zend_extension=<path_to_zend_debugger> zend_extension=<path_to_zend_optimizer> |
我們要啟動 Xdebug 所以在 php.ini 底部添加 Xdebug 章節,例如
|
[xdebug] zend_extension="C:\xampp\php\ext\php_xdebug-2.7.1-7.3-vc15.dll" xdebug.remote_enable=1 <--- 開啟可遠端控制 xdebug.remote_port=9911 <--- 指定一個沒用到的 port ,這是提供 phpStorm 連入 (預設9000) |
儲存並關閉設定,我們可以查看 xdebug 是否啟動
|
PHP 7.3.1 (cli) (built: Jan 9 2019 22:43:14) ( ZTS MSVC15 (Visual C++ 2017) x86 ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies with Xdebug v2.7.1, Copyright (c) 2002-2019, by Derick Rethans |
寫入一支 php 查看是否已經出現 xdebug 安裝的資訊
在 phpStorm 設定
參考官方文章,Settings (Ctrl + Alt + S) > Languages & Frameworks > PHP
如果 Xdebug 有正確安裝的話會看到以下版本正確的顯示。如果沒有正確安裝,會顯示 Debugger: Not installed
接著設定 port ,也就是我們在 php.ini 寫入的 xdebug.remote_port=9911
儲存設定後關閉。接著我們使用 Chrome 來瀏覽 PHP 專案,所以我們要安裝瀏覽器輔助套件 xdebug-helper 。其他瀏覽器可參考官網的列表。
安裝完成以後,我們寫段 Script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
<?php session_start(); class Cart { public function __construct() { $_SESSION['cart'] = []; } public function add(array $params): string { $id = strtoupper(uniqid()); $_SESSION['cart'][$id] = $params; return $id; } public function all() { return $_SESSION['cart']; } } $cart = new Cart(); $firstId = $cart->add(['id' => 123, 'title' => 'Product']); $secondId = $cart->add(['id' => 456, 'title' => 'GOGORO']); $items = $cart->all(); print_r($items); |
接著設定斷點,準備觀察
點選右上角視窗電話符號,或是選單 Run > Start Listening for PHP Debug Connections 準備監聽
打開 Chrome 啟動套件 Debug
接著運行網頁,phpStorm 就會自動出現除錯模式,點擊不同按紐,可以直接查看變數
例如
不斷點擊按紐,可以看到斷點呈現的變數資訊,到結束時,若 PHP 有輸出指令,可以在 output 檢視結果。
Ububtu 安裝 Xdebug
|
sudo aptitude install php7.3-dev sudo aptitude install php-pear sudo pecl channel-update pecl.php.net |
安裝好後會看到這樣的訊息,要你前往添加 php.ini 的參數 zend_extension
|
Build process completed successfully Installing '/usr/lib/php/20170718/xdebug.so' install ok: channel://pecl.php.net/xdebug-2.7.2 configuration option "php_ini" is not set to php.ini location You should add "zend_extension=/usr/lib/php/20170718/xdebug.so" to php.ini |
當然也可以查詢 extension 安裝在哪個目錄
|
php-config --extension-dir // 例如我的顯示 /usr/lib/php/20170718 |
接著依照指示修改 php.ini,記得兩處都要
|
sudo vim /etc/php/7.3/cli/php.ini sudo vim /etc/php/7.3/apache2/php.ini |
如果已經有 zend_extension 參數,記得註解掉,我們改用以下
|
[xdebug] zend_extension="/usr/lib/php/20170718/xdebug.so" xdebug.remote_enable=1 <--- 開啟可遠端控制 xdebug.remote_port=9911 <--- 指定一個沒用到的 port ,這是提供 phpStorm 連入 (預設9000) |
2019-08-27 / JSN / 0 Comments / 1,291 次瀏覽
使用標籤 input 的時候,配合屬性 pattern 可以透過正規表示法來驗證,以下例子是限制密碼最少輸入8-12位英文與數字
|
<input type="password" pattern="^([a-zA-Z]+\d+|\d+[a-zA-Z]+)[a-zA-Z0-9]*$" minlength="8" maxlength="12" title="請最少輸入8-12位英文與數字"> |
See the Pen
PoYmNQB by 檀熤斮 (@sbgjbjaa)
on CodePen.
2019-08-22 / JSN / 1 Comment / 759 次瀏覽
使用 phpStorm 版本 2019.1.3 進行教學,首先設定,我們在快捷鍵按下 Ctrl + Shift + A 輸入 Edit Configurations
點選右下角 FIX
兩個都指定版本例如 PHP7.3,之後點選 OK
發現這裡本來的錯誤消失了,之後再按 OK
接著我們下快捷鍵 Ctrl + Shift + A 輸入 Settings,進入 Languages & Frameworks > PHP > Test Frameworks
指定測試項目
我們直接使用 Composer 的 PHPUnit ,並指定 phpunit.xml 設定檔位置
接下來打開測試檔案,我們可以直接在 methods 左側的綠色箭頭,點擊後會自動運行測試
如果運行成功會出現綠色打勾
2019-08-21 / JSN / 0 Comments / 3,658 次瀏覽
Laravel 整合了 phpunit 製作單元/功能測試,我們以空專案 blog 來進行範例。
|
cd blog composer create-project --prefer-dist laravel/laravel . |
資料庫設定
寫測試的時候,建立一份專門提供給測試的資料庫,避免與實際運作的開發環境共用。根目錄底下,複製一份 .env 為 .env.testing 並修改內容,運行測試的時候透過 artisan 指令添加參數 –env=testing 將會覆蓋 .env 的值
|
// .env.testing .... DB_DATABASE=測試資料庫名稱 DB_USERNAME=測試使用者帳號 DB_PASSWORD=測試使用者密碼 |
修正 DB 支援的問題
若出現 Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 那麼請修改 app/Providers/AppServiceProvider.php
|
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } |
建立 Migration
一開始先建立 DB Schema
|
php artisan make:migration create_posts_table |
|
// database\migrations\2019_08_19_071005_create_posts_table.php public function up() { Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title', 50); $table->longText('content'); $table->timestamps(); }); } |
記住,我們要運行在測試資料庫
|
php artisan config:clear // 記得清除快取,使之可以讀取 testing php artisan migrate --env=testing |
建立資料表 Posts
|
php artisan make:model Post |
建立測試資料工廠
這裡的工廠 PostFactory 負責定義我們的假資料工廠,只要返回我們需要的欄位即可
|
php artisan make:factory PostFactory --model=Post |
|
// database\factories\PostFactory.php $factory->define(Post::class, function (Faker $faker) { return [ 'title' => $faker->word, 'content' => $faker->paragraph ]; }); |
建立單元測試
我們在單元測試中會做這幾件事情
|
php artisan make:test PostTest --unit |
可以建立多個方法來進行測試,命名的規則例如
- testExample() 在測試顯示時的名稱叫做 Example
- testUserRegister() 在測試顯示時的名稱叫做 User register
我們嘗試編寫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
// tests\Unit\PostTest.php use App\Post; class PostTest extends TestCase { // 可以重整資料表,避免測試資料不斷累積。注意這會刪除所有資料,不要用在正式環境 use RefreshDatabase; public function testExample() { // 建立5筆資料 factory(Post::class, 5)->create(); // 取得所有資料 $posts = Post::all(); // 斷言結果 $this->assertCount(5, $posts); } } |
接著運行測試,但很重要的記得清除緩存 config:clear,讓測試環境能抓取 .env.testing。
|
php artisan config:clear (Windows) vendor\bin\phpunit (Linux) vendor/bin/phpunit |
功能測試
上面做的是單元測試,那假設我們要測試 API 是否符合預期,我們則要使用功能測試。
新增一個 Controller
|
php artisan make:controller ProductController |
|
class ProductController extends Controller { public function store(Request $request) { return [ 'id' => (int) $request->id, 'title' => 'productTitle' ]; } } |
現在新增路由
|
// api.php Route::post('products', 'ProductController@store'); |
接著下指令產生功能測試
|
php artisan make:test ProductTest |
接著嘗試訪問 API,並斷言回傳的 JSON 符合我們的結構
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
public function testExample() { $pid = 100; $response = $this->json('POST', 'api/products', [ 'id' => $pid ]); // 斷言結構是否相符合 $response->assertExactJson([ 'id' => $pid, 'title' => 'productTitle' ]); // 斷言回傳值是否相等 $response->assertJson([ 'id' => $pid, 'title' => true ]); } |
|
php artisan config:clear (Windows) vendor\bin\phpunit (Linux) vendor/bin/phpunit |
如果要在 Request 加入 Header 可以這麼寫
|
$response = $this->withHeaders([ 'X-Header' => 'Value', ])->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertJson([ 'created' => true, ]); |
若要為 Response 除錯,可以選用添加
|
$response->dumpHeaders(); $response->dump(); |
如果使用 phpStorm 進行測試,我們可以透過設定進行測試,請參考這篇。
2019-07-08 / JSN / 0 Comments / 732 次瀏覽
匯出 Migration
首先安裝這個套件,先匯出 DB Schema 到 migration
|
composer require --dev "xethron/migrations-generator" |
Laravel 5.5 以後的版本,下載好後就不需安裝任何的 Providers。使用方法如:
|
// 所有資料表 php artisan migrate:generate // 指定資料表 php artisan migrate:generate table1,table2,table3,table4,table5 // 所有資料表但排除某些表,可加參數 --ignore="table3,table4,table5" // 檢視所有可選用的參數 php artisan help migrate:generate |
不過資料表欄位的型態,若是 Enum 的時候,目前版本 v2.0.2 會出錯,請修改 src/Xethron/MigrationsGenerator/Generators/FieldGenerator.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
protected function setEnum(array $fields, $table) { foreach ($this->getEnum($table) as $column) { $column_name = isset($column->column_name) ? $column->column_name : $column->COLUMN_NAME; $column_type = isset($column->column_type) ? $column->column_type : $column->COLUMN_TYPE; $fields[$column_name]['type'] = 'enum'; $fields[$column_name]['args'] = str_replace('enum(', 'array(', $column_type); } return $fields; } |
主要是 MySQL 8 返回的欄位名稱是大寫, MariaDB 返回的是小寫,需要稍作修改就可以了。我提出了合併請求,不過我看目前開發者合併停滯在 2017 年,因為這個功能僅單次使用,我也就不再 fork 了,手改一下就好。
匯出 Seed
接著產出 seed,就下載這個套件
|
composer require orangehill/iseed |
一樣 Laravel 5.4 以後不需要做任何安裝設定。比較麻煩的是要個別指定匯出的資料表名稱,使用方法如
|
// 匯出所需資料 php artisan iseed my_table php artisan iseed my_table,another_table // 產出的 seeder class 名稱加入前綴 php artisan iseed my_table --classnamesuffix=Customizations // 強制覆蓋已存在的 seed php artisan iseed users --force |