Laravel验证问题记录
1.当购物车提交时,POST传来一个对象{address:2,item:{ {ksu_id:2,count:2},{ksu_id:2,count:2}, }
验证方法:
public function rules()
{
return [
// 判断用户提交的地址 ID 是否存在于数据库并且属于当前用户
// 后面这个条件非常重要,否则恶意用户可以用不同的地址 ID 不断提交订单来遍历出平台所有用户的收货地址
'address_id' => [
'required',
Rule::exists('user_addresses', 'id')->where('user_id', $this->user()->id),
],
'items' => ['required', 'array'],
'items.*.sku_id' => [ // 检查 items 数组下每一个子数组的 sku_id 参数
'required',
function ($attribute, $value, $fail) {
if (!$sku = ProductSku::find($value)) {
return $fail('该商品不存在');
}
if (!$sku->product->on_sale) {
return $fail('该商品未上架');
}
if ($sku->stock === 0) {
return $fail('该商品已售完');
}
// 获取当前索引
preg_match('/items\.(\d+)\.sku_id/', $attribute, $m);
$index = $m[1];
// 根据索引找到用户所提交的购买数量
$amount = $this->input('items')[$index]['amount'];
if ($amount > 0 && $amount > $sku->stock) {
return $fail('该商品库存不足');
}
},
],
'items.*.amount' => ['required', 'integer', 'min:1'],
];
}
}
在检查 sku_id 时我们依然判断了对应 SKU 是否存在、商品是否上架、库存是否充足,因为用户在把商品加入购物车,再到下单时商品的各个状态都可能发生变化。 在检查库存时,我们需要获取用户想要购买的该 SKU 数量,我们可以通过匿名函数的第一个参数 $attribute 来获取当前 SKU 所在的数组索引,比如第一个 SKU 的 $attribute 就是 items.0.sku_id,所以我们采用正则的方式将这个 0 提取出来,$this->input('items')[0]['amount'] 就是用户想购买的数量。 接下来我们来写具体的创建订单逻辑: app/Http/Controllers/OrdersController.php <?php namespace App\Http\Controllers; use App\Http\Requests\OrderRequest;
use App\Models\ProductSku;
use App\Models\UserAddress;
use App\Models\Order;
use Carbon\Carbon; class OrdersController extends Controller
{
public function store(OrderRequest $request)
{
$user = $request->user();
// 开启一个数据库事务
$order = \DB::transaction(function () use ($user, $request) {
$address = UserAddress::find($request->input('address_id'));
// 更新此地址的最后使用时间
$address->update(['last_used_at' => Carbon::now()]);
// 创建一个订单
$order = new Order([
'address' => [ // 将地址信息放入订单中
'address' => $address->full_address,
'zip' => $address->zip,
'contact_name' => $address->contact_name,
'contact_phone' => $address->contact_phone,
],
'remark' => $request->input('remark'),
'total_amount' => 0,
]);
// 订单关联到当前用户
$order->user()->associate($user);
// 写入数据库
$order->save(); $totalAmount = 0;
$items = $request->input('items');
// 遍历用户提交的 SKU
foreach ($items as $data) {
$sku = ProductSku::find($data['sku_id']);
// 创建一个 OrderItem 并直接与当前订单关联
$item = $order->items()->make([
'amount' => $data['amount'],
'price' => $sku->price,
]);
$item->product()->associate($sku->product_id);
$item->productSku()->associate($sku);
$item->save();
$totalAmount += $sku->price * $data['amount'];
} // 更新订单总金额
$order->update(['total_amount' => $totalAmount]); // 将下单的商品从购物车中移除
$skuIds = collect($items)->pluck('sku_id');
$user->cartItems()->whereIn('product_sku_id', $skuIds)->delete(); return $order;
}); return $order;
}
Laravel验证问题记录的更多相关文章
- Laravel技巧之记录多日志
相信每个小伙伴在使用laravel的时候都会记录日志.查看日志.那么问题来了,比如我在对接zabbix接口的时候,使用 Log::info() 会让日志全部记录在 storage/logs/larav ...
- 关于html以及js相关格式验证的记录
关于html中禁止输入的一些写法主要是实现实时监听值: 下面的例子实现的事只运行输入数字切小数位数不能超过两位的示例. 1. onkeyup事件是在输的时候在键盘松开的时候进行触发 ...
- Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)
一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...
- laravel验证规则
就拿laravel的登入验证来举例: 1.进入login控制器, use AuthenticatesUsers;从这里点进去找到验证规则 //验证protected function validate ...
- laravel 验证机制validation
Laravel 中 validation 验证 返回中文提示 全局设置 自己建一个zn文件夹,然后把en的4个文件全复制过去,修改validation.php的代码为下面的内容,然后在app.php修 ...
- laravel开发扩展记录
whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置.laravel默认安装.区域 1 -- 是错误异常的简介区域 2 -- 是错 ...
- Laravel 验证 教程
英文源文章: https://www.techiediaries.com/laravel-authentication-tutorial/ 在上一篇教程中,我们已经接触过Laravel,同时介绍了最新 ...
- Shiro权限验证代码记录,正确找到shiro框架在什么地方做了权限识别
权限验证方式的验证代码: org.apache.shiro.web.servlet.AdviceFilter这个类是所有shiro框架提供的默认权限验证实例类的父类 验证代码: public void ...
- Yii 中比较常用的rules验证规则记录
查看代码 打印 01 return array( 02 03 //必须填写 04 array('email, username, password,agree,verifyPa ...
随机推荐
- web文件系统
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- CUDA-F-2-2-核函数计时
Abstract: 本文介绍CUDA核函数计时方法 Keywords: gettimeofday,nvprof 开篇废话 继续更新CUDA,同时概率和数学分析也在更新,欢迎大家访问www.face2a ...
- .NET(c#) 移动APP开发平台 - Smobiler(1)
转载地址:https://www.cnblogs.com/oudi/p/8288617.html 如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xam ...
- Inter IPP & Opencv + codeblocks 在centos 环境下的配置
一.先安装codeblocks wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-12.noar ...
- 统计mysql某个数据库的表数量以及表记录数
统计MySQL中某个数据库中有多少张表 SELECT count(*) TABLES, table_schema FROM information_schema.TABLES where ...
- webpack搭建多页面系统(一):对webpack 构建工具的理解
为什么使用webpack构建工具? 1.开发效率方面: 在一般的开发过程中,分发好任务后,每个人完成自己单独的页面,如果有的人开发完成之后,接手别人的任务,就有可能造成开发时候的冲突. 如果利用模块化 ...
- C++入门经典-例8.5-多重继承
1:C++允许子类从多个父类继承公有的和受保护的成员,这称为多重继承. 2:多重继承的定义.多重继承有多个基类名称标识符,其声明形式如下: class 派生类名标识符:[继承方式] 基类名标识符1,. ...
- JS基础_变量提升和函数提升
1.在函数中,不使用var声明的变量都会变为全局变量 function fun(){ d=10; //window.d=10; }; console.log(10);//10 2.定义形参就相当于在函 ...
- Nginx-rtmp之 ngx_rtmp_send.c 文件分析
1. 简述 1.1 RTMP 消息类型 /* RTMP message types */ #define NGX_RTMP_MSG_CHUNK_SIZE 1 #define NGX_RTMP_MSG_ ...
- weblogic性能调优
1.设置java参数: a) 编辑Weblogic Server启动脚本文件: /user_projects/domains/Domain_jgbs/bin/startWebLogic.sh /use ...