Hyperf 单元测试运行报错:PHP Warning: pcntl_fork() has been disabled for security reasons in... 作者: Chuwen 时间: 2023-06-12 分类: PHP 评论 ## 背景 因为 Hyperf 使用协程运行,故原本的 PHPUnit 的方式就无法运行,需要使用框架自带的 `co-phpunit` 二进制程序运行 ## 配置 PHPUnit 如果你原本就配置了 PHPUnit,建议删掉重新配置 ![](https://cdn.nowtime.cc/2023/07/09/536344092.png) 然后再按照如下步骤进行配置: 1. **PHPUnit 库**选择 *phpunit.phar* 路径 2. *phpunit.phar* 输入框选择你项目路径下的 `vendor/bin/co-phpunit` 文件 3. **测试运行程序** - *默认配置文件* 勾选,选择项目路径下的 `phpunit.xml` 文件 4. 最后点击“确定”保存即可 ![](https://cdn.nowtime.cc/2023/07/09/2791021112.png) ## 调整 PHPUnit "运行/调试配置模版" ![](https://cdn.nowtime.cc/2023/06/12/1302679487.png) 在第 4 步输入例如:`--prepend /Users/chuwen/wwwroot/xxxxx-hyperf/test/bootstrap.php`,其中 *xxxxx-hyperf* 是项目名,要改成你的项目名 ![](https://cdn.nowtime.cc/2023/06/12/3789934554.png) 移除在配置前的配置 ![](https://cdn.nowtime.cc/2023/06/12/3500733315.png) 然后再运行一下就可以了 ![](https://cdn.nowtime.cc/2023/06/12/2418105964.png)
Laravel 模型(Model) 关联(eloquent-relationships) 查询未找到值返回默认值 作者: Chuwen 时间: 2023-05-29 分类: Laravel 评论 ## Laravel 模型关联查询未找到值返回默认值 在实际业务中,经常会用到模型关联查询,但是有时候关联的那个模型在数据库中不存在,则会返回 null,如果你再去判断是否为 null 逻辑就很复杂,下面给出一个现实中的常见一个例子 假设有 2 个模型,`User::class` 和 `UserConfig::class` **User::class** ```php hasOne(\App\Models\UserConfig::class, 'uid', 'id'); } } ``` **UserConfig::class** ```php $userM->config->locales ]; ``` ## 解决方法 [翻阅文档](https://laravel.com/docs/10.x/eloquent-relationships#default-models)发现有这样一个方法 `withDefault()` 官方文档的解释: > The belongsTo, hasOne, hasOneThrough, and morphOne relationships allow you to define a default model that will be returned if the given relationship is null. This pattern is often referred to as the Null Object pattern and can help remove conditional checks in your code. In the following example, the user relation will return an empty App\Models\User model if no user is attached to the Post model: > > 机器翻译成中文: > >> 如果给定的关系为空,则可以定义默认模型。这种模式通常称为 `空对象模式`,可以帮助删除代码中的条件检查。在以下示例中,如果没有用户附加到Post模型,用户关系将返回一个空的App\Models\User模型: 用法很简单,只需要在 `hasOne` 末尾加上 `->withDefault()` 方法,然后在 `UserConfig::class` 的 `$attributes` 属性写上默认值即可 **User::class** ```php hasOne(\App\Models\UserConfig::class, 'uid', 'id')->withDefault(); } } ``` **UserConfig::class** ```php ['en'] ]; } ``` ```php $uid = 1; $userM = User::findOrFail($uid); return [ // 如果关联的 config 模型查找不到值,就会返回默认值 ['en'] 'locales' => $userM->config->locales ]; ```
Laravel Model(模型)实现分表查询 - 根据 UID 一定数量分表查询 作者: Chuwen 时间: 2023-04-28 分类: Laravel,PHP 评论 当业务达到一定量,一些表就可能需要用到分表、分库等方法,加快数据库查询速度,在 Laravel 中可以按照如下方式实现 ### 代码实现如下 ```php table . "_" . (($tableNum - 1) * $count + 1) . "_" . ($tableNum * $count); } public function scopeByUid($query, int $uid) { return $query->from(self::getPartitionedTableName($uid))->where('uid', $uid); } } ``` ### 使用方法 ```php // 查找的表是 orders_1_10000 Orders::byUid(4)->first(); // 查找的表是 orders_10001_20000 Orders::byUid(20000)->first(); ```
使用 PHPStorm 的高级元数据(PhpStorm advanced metadata) 作者: Chuwen 时间: 2023-02-11 分类: Laravel,PHP 评论 ## 例子 1 你通过 `$request->user()` 想拿到用户模型,但是没有类型提示很苦恼,你可以这样做 在项目跟路径创建一个文件 `.phpstorm.meta.php`,然后里面的内容写: ```php \App\Models\User::class, ])); } ``` 然后就会有类型提示了: ![](https://cdn.nowtime.cc/2023/02/10/1231715426.png) 更多高级用法请看:https://www.jetbrains.com/help/phpstorm/ide-advanced-metadata.html#map
Laravel 根据 Session ID 获取相关值 作者: Chuwen 时间: 2022-10-10 分类: Laravel 评论 ## 背景 - 「A 系统」域名 `admin.xxxx.com` - 使用的是 Dcat Admin,Session 身份认证 - 「A1 系统」域名 `api.sass.com` - 使用 JWT 身份认证 因为项目有个需求,需要从「A 系统」访问「A1 系统」,实际上是「A 系统」生成 JWT 传递给「A1 系统」,JWT 格式如下: > 使用 `sub` 标记是谁生成的,让「A1 系统」能够进行判断 ![](https://cdn.nowtime.cc/2022/10/10/3948634876.png) 需要实现「A 系统」退出登录,「A1 系统」的 JWT 信息就不能通过认证 因为这 2 个系统是共用一套代码的,所以想到了使用 `Session ID` 写入 JWT `payload` 中,然后「A1 系统」拿到 `Session ID` 去校验 ## 实现 ### 拿到 Laravel Session ID 「A 系统」通过 `Illuminate\Support\Facades\Session::getId()` 拿到长度为 40 的 `Session ID`,生成 JWT 传递给「A1 系统」使用 ![](https://cdn.nowtime.cc/2022/10/10/3680874563.png) ### 「A1 系统」校验 Session ID 是否存在 示例代码如下: ```php // 这里实际需要替换为从 JWT 解析,拿到 `session_id` 字段 $sessionId = ''; $data = Illuminate\Support\Facades\Session::getHandler()->read($sessionId); if(empty($data)){ // TODO: SessionID 不存在,请检查 } ```