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验证问题记录的更多相关文章

  1. Laravel技巧之记录多日志

    相信每个小伙伴在使用laravel的时候都会记录日志.查看日志.那么问题来了,比如我在对接zabbix接口的时候,使用 Log::info() 会让日志全部记录在 storage/logs/larav ...

  2. 关于html以及js相关格式验证的记录

    关于html中禁止输入的一些写法主要是实现实时监听值:      下面的例子实现的事只运行输入数字切小数位数不能超过两位的示例.      1. onkeyup事件是在输的时候在键盘松开的时候进行触发 ...

  3. Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  4. laravel验证规则

    就拿laravel的登入验证来举例: 1.进入login控制器, use AuthenticatesUsers;从这里点进去找到验证规则 //验证protected function validate ...

  5. laravel 验证机制validation

    Laravel 中 validation 验证 返回中文提示 全局设置 自己建一个zn文件夹,然后把en的4个文件全复制过去,修改validation.php的代码为下面的内容,然后在app.php修 ...

  6. laravel开发扩展记录

    whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置.laravel默认安装.区域 1 -- 是错误异常的简介区域 2 -- 是错 ...

  7. Laravel 验证 教程

    英文源文章: https://www.techiediaries.com/laravel-authentication-tutorial/ 在上一篇教程中,我们已经接触过Laravel,同时介绍了最新 ...

  8. Shiro权限验证代码记录,正确找到shiro框架在什么地方做了权限识别

    权限验证方式的验证代码: org.apache.shiro.web.servlet.AdviceFilter这个类是所有shiro框架提供的默认权限验证实例类的父类 验证代码: public void ...

  9. Yii 中比较常用的rules验证规则记录

    查看代码   打印 01 return array( 02   03     //必须填写 04     array('email, username, password,agree,verifyPa ...

随机推荐

  1. Mysql存储时间字段

    兄弟连教育数据库培训教程 Mysql存储时间字段用int.timestamp还是datetime 通常存储时间用datetime类型,现在很多系统也用int存储时间,它们有什么区别?总结如下: int ...

  2. js差异化继承

    var parentObj={ name:"123456", get_name:function(){ return this.name; }, says:function(){ ...

  3. http支持上传文件夹

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  4. vue 项目实战之小坑坑

    1. Vue 多个元素动画 ,需要使用 transition-group 标签,并且需要赋值 唯一 key 值. 2. 用ajax 获取到数据赋值给data 后 ,再手动向data里添加的属性无效. ...

  5. numpy中np.linalg.norm()求向量、矩阵的范数

    np.linalg.norm() # linalg = linear(线性) + algebra(代数),   norm表示范数 x_norm = np.linalg.norm(x, ord=None ...

  6. HDU 5813 Elegant Construction ——(拓扑排序,构造)

    可以直接见这个博客:http://blog.csdn.net/black_miracle/article/details/52164974. 对其中的几点作一些解释: 1.这个方法我们对队列中取出的元 ...

  7. CLOB、BLOB , CLOB与BLOB的区别

    CLOB 定义 数据库中的一种保存文件所使用的类型. Character Large Object SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系.SQL CLOB 是内置类型,它将字 ...

  8. koa 基础(三)路由的另一种写法

    1.配置路由 app.js // 引入模块 const Koa = require('koa'); const router = require('koa-router')(); /*引入是实例化路由 ...

  9. php的core问题

    我们在编写代码的时候,可能会发现,路径下多了一个类似这样的文件, 拿php举例  :  core.php_bin.4528.1379650721 这是因为我们在编写代码时候,出现了指针溢出,段错误等问 ...

  10. jsonp 原理 并模拟实现一个简单的jsonp

    jsonp产生的背景 1.从原网站向目标网站(服务端)发送ajax请的时候,由于浏览器的安全策略(这两个网站只要域名,端口,协议 有一个不同就不允许请求访问)导致跨域,从而请求无法正常进行. 2.We ...