webman-framework 发布1.6.0版本

walkor

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

更多参考控制器参数绑定

支持控制器中间件

<?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');
// 禁用foo插件的admin应用的默认路由,不影响主项目
Route::disableDefaultRoute('foo', 'admin');
// 禁用控制器 [\app\controller\IndexController::class, 'index'] 的默认路由
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);

更多参考文档

支持 $request->setGet() $request->setPost() $request->setHeaders() 覆盖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']);
    }
}

升级注意

如果之前的项目代码不是很规范,可能会有一些兼容问题,主要问题如下:

检查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);
});

升级方法

composer global config --unset repos.packagist
composer require workerman/webman-framework ^1.6.6 -W

提示
因为一些composer镜像更新不及时, 所以可能无法找到最新的webman-framework包, 所以需要运行
composer global config --unset repos.packagist 先把composer代理镜像设置去掉

2035 14 2
14个回答

老大辛苦!

  • 暂无评论
xiaoming

老大辛苦!

  • 暂无评论
不败少龙

注解中间件可以吗?

小天天天天

刚刚升级完,目前一切正常,测试上先跑跑,没问题就上正式

  • 暂无评论
ontheway

点赞👍👍👍🚀🚀🚀

  • 暂无评论
leafer

点赞👍👍👍🚀🚀🚀,老大辛苦!

  • 暂无评论
围猎三锅

点赞支持,老大辛苦

  • 暂无评论
s4160415

Request类 setPost和setGet 报错
另外 有什么办法可以不覆盖旧数据
截图
重现代码
截图
解决方法 需要将setPost或setGet中的 $this->data['post'] = $post; 改成 _data['post']

  • walkor 20天前

    发下重现问题的代码

  • s4160415 20天前

    更新了

  • walkor 20天前
    public function setGet(array $get): Request
        {
            $this->isDirty = true;
            if (isset($this->data)) {
                $this->data['get'] = $get;
            } else {
                $this->_data['get'] = $get;
            }
            return $this;
        }
    
        /**
         * Set post.
         * @param array $post
         * @return Request
         */
        public function setPost(array $post): Request
        {
            $this->isDirty = true;
            if (isset($this->data)) {
                $this->data['post'] = $post;
            } else {
                $this->_data['post'] = $post;
            }
            return $this;
        }
    
        /**
         * Set headers.
         * @param array $headers
         * @return $this
         */
        public function setHeaders(array $headers): Request
        {
            $this->isDirty = true;
            if (isset($this->data)) {
                $this->data['headers'] = $headers;
            } else {
                $this->_data['headers'] = $headers;
            }
            return $this;
        }

    改成这样试下

  • s4160415 20天前

    可以了 建议加上是否强制覆盖的功能

  • walkor 20天前

    什么叫是否强制覆盖?做什么用的

  • ontheway 20天前

    这个setPost、setGet感觉没啥用,他的意思是合并数据类似array_merge()

  • 小Z先生 14天前

    什么场景下会使用setPost、setGet改原始数据 我现在只有拿来过滤参数的前后空格

s4160415

Request setGet setPost 建议加上是否强制覆盖功能

就是旧的数据不清除只是追加数据 比如在webman-admin中 insert数据的时候 除了表单提交的数据 我需要额外追加数据
截图
另外 调用控制器A方法 A方法需要Request接收参数 这时我就可以在调用A方法时setParams 进行追加参数 ---如下图
截图
截图

  • 暂无评论
liziyu

从 Webman-framework v1.5.24 升到1.6.0时出现在vendor/workerman/webman-framework/src/support/App.php这里的报错:

如果做如下修改就能解决,好像有个路径组状函数处有问题。

求指点!!

  • walkor 20天前

    我这没有环境,需要你自己定位下 config_path('app.php'); 为什么返回的是目录,正常回返回一个文件地址。

  • liziyu 20天前

    webman-framework/src/support/helpers.php 下的:

    /**
     * Generate paths based on given information
     * @param string $front
     * @param string $back
     * @return string
     */
    function path_combine(string $front, string $back): string
    {
        return $front . ($back ? (DIRECTORY_SEPARATOR . ltrim($back, DIRECTORY_SEPARATOR)) : $back);
    }

    好像是这里没有正确返回。本地PHP环境为:PHP 8.3.13 (cli) (built: Oct 22 2024 18:39:14) (NTS)

  • walkor 20天前

    看你本地 support/helpers.php 文件

  • liziyu 20天前

    确实是本地helpers没更新原因,谢谢老大!

Van Chin

@walkor 大佬辛苦,支持了 控制器参数绑定注入 workman/webman 的生态越来越好了

  • 暂无评论
汤姆大叔


老大,Request报错了

  • walkor 15天前

    升级下 workerman/webman-framework

  • glitter 14天前
        public function file(?string $name = null): mixed
        {
            $files = parent::file($name);
            if (null === $files) {
                return $name === null ? [] : null;
            }
            if ($name !== null) {
                // Multi files
                if (is_array(current($files))) {
                    return $this->parseFiles($files);
                }
                return $this->parseFile($files);
            }
            $uploadFiles = [];
            foreach ($files as $name => $file) {
                // Multi files
                if (is_array(current($file))) {
                    $uploadFiles[$name] = $this->parseFiles($file);
                } else {
                    $uploadFiles[$name] = $this->parseFile($file);
                }
            }
            return $uploadFiles;
        }
  • 汤姆大叔 14天前

    好了,感谢老大,感谢glitter

  • 楚羽幽 9天前

    老大,使用宝塔的php8.1,8.3也复现这个兄弟的这个问题,我的workerman/webman-framework也升级到5.0.0-rc.3了,按照glitter这个兄弟的代码修改一下Request.php,确实修复了

bieye615

为什么1.6.0后的版本,配置文件server,少了下面红框里的参数,php start.php start 没有监听到listen了,如果改监听配置文件process的listen,框架启动不起来
截图
截图
上面86行,会报造错,找不到listen的key

  • walkor 13天前

    config/server.php 里的配置移动到 config/process.php里了,可能你用了composer镜像,里面包不全,没更新到最新
    执行
    composer require workerman/webman-framework ^1.6.6 -W
    升级到最新

  • bieye615 12天前

    Root composer.json requires workerman/webman-framework 1.6.6 (exact version match: 1.6.6 or 1.6.6.0), found workerman/webman-framework[dev-master, v1.0.0, ..., 1.7.x-dev] but it does not match the constraint.
    执行
    composer require workerman/webman-framework ^1.6.6 -W
    报错,执行不到最新

  • walkor 12天前

    composer镜像去掉

  • bieye615 12天前

    非常感谢,没成功,我再研究研究

  • walkor 12天前

    执行
    composer config --unset repos.packagist
    删除镜像代理,然后再
    composer require workerman/webman-framework ^1.6.6 -W

  • bieye615 12天前

    执行
    composer config --unset repos.packagist
    报错,我得再研究下
    应该是php7.4版本对于1.6.6低了

  • bieye615 12天前

    使用composer create-project workerman/webman,创建的项目都是github里最新版本1.6.2,都是有问题的

  • walkor 12天前

    webman-framework 1.6 需要php8, php7.4用不了
    截图
    截图

    刚买了台新服务器测试 php7.4 创建新项目, 会自动使用 workerman/webman-framework v1.5.26, 测试没有问题
    如果你是php7.x, composer require workerman/webman-framework 1.5.26

  • liziyu 12天前

    建议老大把升级注意事项提示放在这里说明下:https://www.workerman.net/page/update

  • walkor 12天前

    反馈的问题大多数是用了阿里云或者腾讯云之类的composer代理镜像导致新的包拉不到

  • liziyu 12天前

    比如我现在有个疑问:项目目录下的process目录(我是几年前的老项目一直没动过)与现在社区github里的app\process的有什么区别?!如果我想升级到最新应该怎么移植!~

  • walkor 12天前

    兼容老项目process目录在 根目录,直接升级就行,不影响老项目原来的目录结构

  • liziyu 12天前

    明白了,谢谢老大!~

z

composer config --unset repos.packagist

composer require workerman/webman-framework ^1.6.6 -W

./composer.json has been updated
Running composer update workerman/webman-framework --with-all-dependencies
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

Problem 1

  • Root composer.json requires workerman/webman-framework 1.6.6 (exact version match: 1.6.6 or 1.6.6.0), found workerman/webman-framework[dev-master, v1.0.0, ..., v1.6.4] but it does not match the constraint.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.

windown10上全新安装,启动不了windows.bat,提示错误 v1.6.4

Fatal error: Declaration of Webman\Http\Request::file($name = null) must be compatible with Workerman\Protocols\Http\Request::file(?string $name = null): mixed in D:\webman\vendor\workerman\webman-framework\src\Http\Request.php on line 119
Worker process terminated with ERROR: E_COMPILE_ERROR "Declaration of Webman\Http\Request::file($name = null) must be compatible with Workerman\Protocols\Http\Request::file(?string $name = null): mixed in D:\webman\vendor\workerman\webman-framework\src\Http\Request.php on line 119"

  • walkor 5天前

    composer global config --unset repos.packagist
    执行这个试下

  • z 5天前

    一样的

  • walkor 5天前

    composer global config --unset repos.packagist
    加了 global

×
🔝