'require|length:1,100', 'gender' => 'require|in:1,2', 'age' => 'require|integer|between:1,120', 'height' => 'require|float|between:50,250', 'weight' => 'require|float|between:10,300', 'is_own' => 'in:0,1', 'relation' => 'length:0,50', 'profile_photo' => 'url', 'body_photos' => 'array|checkBodyPhotos', ]; // 验证消息 protected $message = [ 'profile_name.require' => '档案名称不能为空', 'profile_name.length' => '档案名称长度不能超过100个字符', 'gender.require' => '请选择性别', 'gender.in' => '性别参数错误', 'age.require' => '年龄不能为空', 'age.integer' => '年龄必须是整数', 'age.between' => '年龄必须在1-120岁之间', 'height.require' => '身高不能为空', 'height.float' => '身高必须是数字', 'height.between' => '身高必须在50-250厘米之间', 'weight.require' => '体重不能为空', 'weight.float' => '体重必须是数字', 'weight.between' => '体重必须在10-300公斤之间', 'is_own.in' => '档案类型参数错误', 'relation.length' => '关系描述不能超过50个字符', 'profile_photo.url' => '档案照片必须是有效的URL', 'body_photos.array' => '身体照片必须是数组格式', 'body_photos.checkBodyPhotos' => '身体照片格式错误,必须包含front、side、back三个角度的照片', ]; // 验证场景 protected $scene = [ 'create' => ['profile_name', 'gender', 'age', 'height', 'weight', 'is_own', 'relation', 'profile_photo', 'body_photos'], 'update' => ['profile_name', 'age', 'height', 'weight', 'relation', 'profile_photo', 'body_photos'], ]; /** * 验证身体照片格式 * @param mixed $value * @param string $rule * @param array $data * @return bool */ protected function checkBodyPhotos($value, $rule, $data) { if (!is_array($value)) { return false; } // 必须包含的照片角度 $requiredAngles = ['front', 'side', 'back']; foreach ($requiredAngles as $angle) { if (!isset($value[$angle]) || empty($value[$angle])) { return false; } // 验证URL格式 if (!filter_var($value[$angle], FILTER_VALIDATE_URL)) { return false; } } return true; } }