1.6 คู่มือการอัปเกรด

ก่อนการอัปเกรดให้ทำการสำรองข้อมูล แล้วใช้คำสั่งด้านล่างนี้เพื่ออัปเกรด

composer config -g --unset repos.packagist
composer require -W workerman/webman-framework ^v1.6.11

webman-framework เปิดตัวเวอร์ชัน 1.6.0

ฟีเจอร์ใหม่

ต้องการ PHP>=8.0

รองรับการรับค่าจากพารามิเตอร์ของคอนโทรลเลอร์

<?php
namespace app\controller;
use support\Response;

class UserController
{
    public function create(string $name, int $age, float $balance, bool $vip, array $extension): Response
    {
        return json([
            'name' => $name,
            'age' => $age,
            'balance' => $balance,
            'vip' => $vip,
            'extension' => $extension,
        ]);
    }
}

เข้าถึง /user/create?name=tom&age=18&balance=100.5&vip=1&extension[foo]=bar จะได้รับผลลัพธ์

{
  "name": "tom",
  "age": 18,
  "balance": 100.5,
  "vip": true,
  "extension": {
    "foo": "bar"
  }
}

นอกจากนี้พารามิเตอร์ยังรองรับการจับคู่เป็นคลาสรวมถึงโมเดล เช่น

<?php
namespace app\controller;
use app\model\User;
class UserController
{
    public function create(User $user): int
    {
        $user->save();
        return $user->id;
    }
}

ดูเพิ่มเติมที่ การจับคู่พารามิเตอร์คอนโทรลเลอร์

รองรับ Middleware ในคอนโทรลเลอร์

<?php
namespace app\controller;
use app\middleware\MiddlewareA;
use app\middleware\MiddlewareB;
use support\Request;
class IndexController
{
    protected $middleware = [
        MiddlewareA::class,
        MiddlewareB::class,
    ];
    public function index(Request $request): string
    {
        return 'hello';
    }
}

รองรับ Route::fallback()->middleware(...); เพิ่ม Middleware สำหรับคำขอ 4xx

ตามปกติแล้วคำขอ 404 จะไม่ผ่าน Middleware ใด ๆ ตั้งแต่เวอร์ชัน 1.6.0 เป็นต้นมา สามารถตั้งค่า Middleware สำหรับคำขอ 4xx ได้

Route::fallback(function(){
    return json(['code' => 404, 'msg' => '404 not found']);
})->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);

รองรับ Route::disableDefaultRoute() ปิดการใช้งานเส้นทางดDefault สำหรับแอปพลิเคชันหรือคอนโทรลเลอร์เฉพาะ

// ปิดการใช้งานเส้นทางดDefault ของโปรเจกหลัก ไม่กระทบกับปลั๊กอินแอปพลิเคชัน
Route::disableDefaultRoute();
// ปิดการใช้งานเส้นทางของแอป admin ในโปรเจกหลัก ไม่กระทบกับปลั๊กอินแอปพลิเคชัน
Route::disableDefaultRoute('', 'admin');
// ปิดการใช้งานเส้นทางดDefault ของปลั๊กอิน foo ไม่กระทบกับโปรเจกหลัก
Route::disableDefaultRoute('foo');
// ปิดการใช้งานเส้นทางดDefault ของแอป admin ในปลั๊กอิน foo ไม่กระทบกับโปรเจกหลัก
Route::disableDefaultRoute('foo', 'admin');
// ปิดการใช้งานเส้นทางดDefault ของคอนโทรลเลอร์ [\app\controller\IndexController::class, 'index']
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);

ดูเอกสารเพิ่มเติม

รองรับ $request->setGet() $request->setPost() $request->setHeader() แทนที่ข้อมูล get post headers

$request->get(); // สมมุติได้ ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // สุดท้ายได้ ['name' => 'tom']
// ดังนี้จะคล้ายกัน
$requset->setPost();
$request->setHeaders();

ดูเอกสารเพิ่มเติม

view() รองรับการละเว้นพารามิเตอร์เทมเพลตและเส้นทางที่แน่นอน

<?php
namespace app\controller;
use support\Request;
class UserController
{
    public function hello(Request $request)
    {
        // เท่ากับ return view('user/hello', ['name' => 'webman']);
        // เท่ากับ return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

การเปลี่ยนแปลงในการตั้งค่าและไฟล์อื่น ๆ

การอัปเกรดใหม่ config/server.php ของการตั้งค่า listen ฯลฯ ถูกย้ายไปที่ config/process.php ซึ่งมีผลเฉพาะโปรเจกต์ใหม่ที่สร้างด้วย composer create-project โปรเจกต์เก่าไม่ได้รับผลกระทบ
ในเวอร์ชันใหม่โฟลเดอร์ process ถูกย้ายไปที่ app/process ซึ่งมีผลเฉพาะโปรเจกต์ใหม่ที่สร้างด้วย composer create-project โปรเจกต์เก่าไม่ได้รับผลกระทบ

ข้อควรระวังในการอัปเกรด

หากโค้ดโปรเจกต์ก่อนหน้านี้ไม่เป็นระเบียบ อาจมีปัญหาเกี่ยวกับความเข้ากันได้ ปัญหาหลักมีดังนี้:

ตรวจสอบการใช้ฟังก์ชัน view()

ตรวจสอบว่าในโปรเจกต์ที่จะอัปเกรด ฟังก์ชัน view() มีพารามิเตอร์เทมเพลตที่ขึ้นต้นด้วย / หรือไม่ หากมีให้ลบ / ออก เช่น

return view('/user/index');
// ต้องเปลี่ยนเป็น
return view('user/index');

ตรวจสอบว่าสอดคล้องกันหรือไม่ที่กำหนดพารามิเตอร์เส้นทางที่กำหนดเอง

Route::any('/user/{name}', function (Request $request, $myname) {
   return response($myname);
});
// ต้องเปลี่ยนเป็น
Route::any('/user/{name}', function (Request $request, $name) {
   return response($name);
});

หมายเหตุ ควรเพิ่มการระบุประเภท Request ก่อนพารามิเตอร์ $request

ปิด proxy composer

การใช้ proxy ของ composer เช่น Alibaba Cloud อาจมีความล่าช้า ซึ่งอาจทำให้เวอร์ชันของแพ็คเกจไม่เป็นเวอร์ชันล่าสุด ทำให้เกิดปัญหาในการอัปเกรด โปรดดำเนินการตามคำสั่งด้านล่างเพื่อลSUPport composer proxy แล้วจึงค่อยอัปเกรด

composer config -g --unset repos.packagist