Руководство по обновлению до 1.6

Перед обновлением сделайте резервную копию, выполните следующие команды для обновления

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

Релиз версии 1.6.0 webman-framework

Новые функции

Требуется 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;
    }
}

Дополнительную информацию см. в привязке параметров контроллера

Поддержка промежуточного ПО для контроллеров

<?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(...); для добавления промежуточного ПО в 4xx запросы

В обычных условиях запросы 404 не проходят через промежуточное ПО, начиная с версии 1.6.0, можно установить промежуточное ПО для 4xx запросов

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

Поддержка Route::disableDefaultRoute() для отключения маршрутов по умолчанию для определенных приложений и контроллеров

// Отключение маршрутов по умолчанию для основного проекта, без влияния на плагины приложений
Route::disableDefaultRoute();
// Отключение маршрутов для приложения admin основного проекта, без влияния на плагины
Route::disableDefaultRoute('', 'admin');
// Отключение маршрутов по умолчанию для плагина foo, без влияния на основной проект
Route::disableDefaultRoute('foo');
// Отключение маршрутов по умолчанию для приложения admin плагина foo, без влияния на основной проект
Route::disableDefaultRoute('foo', 'admin');
// Отключение маршрутов по умолчанию для контроллера [\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']);
    }
}

Другие изменения в конфигурации и файлах

В новой версии конфигурация listen и другие настройки перенесены из config/server.php в 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.

Отключите прокси composer

Прокси, такие как Aliyun и другие зеркала composer, могут иметь задержку, версии пакетов в них могут быть не самыми последними, что может привести к проблемам с обновлением. Пожалуйста, выполните следующую команду для удаления прокси composer, а затем обновите его

composer config -g --unset repos.packagist