Hướng dẫn nâng cấp 1.6

Trước khi nâng cấp, vui lòng sao lưu và thực hiện các lệnh sau để nâng cấp

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

webman-framework phát hành phiên bản 1.6.0

Tính năng mới

Yêu cầu PHP>=8.0

Hỗ trợ lấy đầu vào thông qua tham số điều khiển

<?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,
        ]);
    }
}

Truy cập /user/create?name=tom&age=18&balance=100.5&vip=1&extension[foo]=bar sẽ nhận được kết quả

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

Các tham số cũng hỗ trợ liên kết với các lớp bao gồm mô hình, ví dụ

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

Tham khảo thêm liên kết tham số điều khiển

Hỗ trợ middleware trong điều khiển

<?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';
    }
}

Hỗ trợ Route::fallback()->middleware(...); để thêm middleware cho các yêu cầu 4xx

Thông thường, các yêu cầu 404 sẽ không đi qua bất kỳ middleware nào. Kể từ phiên bản 1.6.0, có thể thiết lập middleware cho các yêu cầu 4xx

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

Hỗ trợ Route::disableDefaultRoute() để tắt định tuyến mặc định cho ứng dụng hoặc điều khiển cụ thể

// Tắt định tuyến mặc định cho dự án chính, không ảnh hưởng đến plugin ứng dụng
Route::disableDefaultRoute();
// Tắt định tuyến cho ứng dụng admin của dự án chính, không ảnh hưởng đến plugin ứng dụng
Route::disableDefaultRoute('', 'admin');
// Tắt định tuyến mặc định cho plugin foo, không ảnh hưởng đến dự án chính
Route::disableDefaultRoute('foo');
// Tắt định tuyến mặc định cho ứng dụng admin của plugin foo, không ảnh hưởng đến dự án chính
Route::disableDefaultRoute('foo', 'admin');
// Tắt định tuyến mặc định của điều khiển [\app\controller\IndexController::class, 'index']
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);

Tham khảo tài liệu thêm

Hỗ trợ $request->setGet() $request->setPost() $request->setHeader() để ghi đè dữ liệu get post headers

$request->get(); // Giả sử nhận được ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // Cuối cùng nhận được ['name' => 'tom']
// Tương tự như dưới đây
$requset->setPost();
$request->setHeaders();

Tham khảo tài liệu thêm

view() hỗ trợ bỏ qua tham số mẫu và đường dẫn tuyệt đối

<?php
namespace app\controller;
use support\Request;
class UserController
{
    public function hello(Request $request)
    {
        // Tương đương với return view('user/hello', ['name' => 'webman']);
        // Tương đương với return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

Các cấu hình và thay đổi tệp khác

Trong phiên bản mới, các cấu hình như listen trong config/server.php đã được chuyển đến config/process.php, chỉ ảnh hưởng đến các dự án mới tạo bằng composer create-project, không ảnh hưởng đến các dự án cũ khi nâng cấp.
Phiên bản mới đã di chuyển thư mục process đến app/process, chỉ ảnh hưởng đến các dự án mới tạo bằng composer create-project, không ảnh hưởng đến các dự án cũ khi nâng cấp.

Lưu ý khi nâng cấp

Nếu mã dự án trước đây không được chuẩn hóa, có thể có một số vấn đề tương thích, các vấn đề chính như sau:

Kiểm tra việc sử dụng hàm view()

Kiểm tra xem trong dự án cần nâng cấp có sử dụng view() với tham số mẫu bắt đầu bằng dấu / hay không, nếu có thì cần loại bỏ dấu / ở đầu, ví dụ

return view('/user/index');
// Cần thay đổi thành
return view('user/index');

Kiểm tra các tham số định tuyến tùy chỉnh có nhất quán hay không

Route::any('/user/{name}', function (Request $request, $myname) {
   return response($myname);
});
// Cần thay đổi thành
Route::any('/user/{name}', function (Request $request, $name) {
   return response($name);
});

Lưu ý rằng tham số $request cần thêm kiểu đề xuất Request ở phía trước.

Tắt proxy composer

Các proxy hình ảnh như Alibaba Cloud và các proxy composer khác có thể bị trễ, các phiên bản gói trong đó có thể không phải là phiên bản mới nhất, dẫn đến các vấn đề khi nâng cấp, vui lòng thực hiện lệnh sau để xóa proxy composer và sau đó nâng cấp

composer config -g --unset repos.packagist