要求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';
}
}
正常情况下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();
// 禁用主项目的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->get(); // 假设得到 ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // 最终得到 ['name' => 'tom']
// 以下类似
$requset->setPost();
$request->setHeaders();
<?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()是否有以/
开头的模板参数,有的话把开头的/
去掉,例如
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代理镜像设置去掉
老大辛苦!
老大辛苦!
注解中间件可以吗?
不支持注解中间件
好的,老大
刚刚升级完,目前一切正常,测试上先跑跑,没问题就上正式
点赞👍👍👍🚀🚀🚀
点赞👍👍👍🚀🚀🚀,老大辛苦!
点赞支持,老大辛苦
Request类 setPost和setGet 报错
另外 有什么办法可以不覆盖旧数据
重现代码
解决方法 需要将setPost或setGet中的 $this->data['post'] = $post; 改成 _data['post']
发下重现问题的代码
更新了
改成这样试下
可以了 建议加上是否强制覆盖的功能
什么叫是否强制覆盖?做什么用的
这个setPost、setGet感觉没啥用,他的意思是合并数据类似array_merge()
什么场景下会使用setPost、setGet改原始数据 我现在只有拿来过滤参数的前后空格
Request setGet setPost 建议加上是否强制覆盖功能
就是旧的数据不清除只是追加数据 比如在webman-admin中 insert数据的时候 除了表单提交的数据 我需要额外追加数据
另外 调用控制器A方法 A方法需要Request接收参数 这时我就可以在调用A方法时setParams 进行追加参数 ---如下图
从 Webman-framework v1.5.24 升到1.6.0时出现在
vendor/workerman/webman-framework/src/support/App.php
这里的报错:如果做如下修改就能解决,好像有个路径组状函数处有问题。
求指点!!
我这没有环境,需要你自己定位下 config_path('app.php'); 为什么返回的是目录,正常回返回一个文件地址。
webman-framework/src/support/helpers.php
下的:好像是这里没有正确返回。本地PHP环境为:
PHP 8.3.13 (cli) (built: Oct 22 2024 18:39:14) (NTS)
看你本地 support/helpers.php 文件
确实是本地helpers没更新原因,谢谢老大!
@walkor 大佬辛苦,支持了 控制器参数绑定注入 workman/webman 的生态越来越好了
老大,Request报错了
升级下 workerman/webman-framework
好了,感谢老大,感谢glitter
老大,使用宝塔的php8.1,8.3也复现这个兄弟的这个问题,我的workerman/webman-framework也升级到5.0.0-rc.3了,按照glitter这个兄弟的代码修改一下Request.php,确实修复了
为什么1.6.0后的版本,配置文件server,少了下面红框里的参数,php start.php start 没有监听到listen了,如果改监听配置文件process的listen,框架启动不起来
上面86行,会报造错,找不到listen的key
config/server.php 里的配置移动到 config/process.php里了,可能你用了composer镜像,里面包不全,没更新到最新
执行
composer require workerman/webman-framework ^1.6.6 -W
升级到最新
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
报错,执行不到最新
composer镜像去掉
非常感谢,没成功,我再研究研究
执行
composer config --unset repos.packagist
删除镜像代理,然后再
composer require workerman/webman-framework ^1.6.6 -W
执行
composer config --unset repos.packagist
报错,我得再研究下
应该是php7.4版本对于1.6.6低了
使用composer create-project workerman/webman,创建的项目都是github里最新版本1.6.2,都是有问题的
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
建议老大把升级注意事项提示放在这里说明下:https://www.workerman.net/page/update
https://www.workerman.net/doc/webman/upgrade/1-6.html
文档直接有
反馈的问题大多数是用了阿里云或者腾讯云之类的composer代理镜像导致新的包拉不到
比如我现在有个疑问:项目目录下的process目录(我是几年前的老项目一直没动过)与现在社区github里的app\process的有什么区别?!如果我想升级到最新应该怎么移植!~
兼容老项目process目录在 根目录,直接升级就行,不影响老项目原来的目录结构
明白了,谢谢老大!~
./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
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"
composer global config --unset repos.packagist
执行这个试下
一样的
composer global config --unset repos.packagist
加了 global