还是拿来主义编程思想,既然别人实现了,就不再造轮子了。
`LaravelShoppingcart`是Laravel下的一个购物车实现,项目地址:
> [https://github.com/Crinsane/LaravelShoppingcart](https://github.com/Crinsane/LaravelShoppingcart)
文档翻译:
针对Laravel 4的简单购物车实现。
### 安装
通过composer安装,编辑 `composer.json` 文件,如下:
#### Laravel4.2及以下
~~~
~~~
"require": {
"laravel/framework": "4.2.*",
"gloudemans/shoppingcart": "~1.2"
}
~~~
~~~
#### Laravel5
~~~
~~~
"require": {
"laravel/framework": "5.0.*",
"gloudemans/shoppingcart": "dev-master"
}
~~~
~~~
#### 接着运行更新命令
~~~
~~~
composer update
~~~
~~~
添加以下代码到 `app/config/app.php` 的 `service providers` 数组里
~~~
~~~
'Gloudemans\Shoppingcart\ShoppingcartServiceProvider'
~~~
~~~
添加以下代码到`aliases`数组中
~~~
~~~
'Cart' => 'Gloudemans\Shoppingcart\Facades\Cart',
~~~
~~~
完成以上工作就可以在你的项目中使用了。
### 使用
Shoppingcart提供了以下的可用方法:
#### Cart:add()
~~~
~~~
/**
* Add a row to the cart
* 向购物车添加新行
*
* @param string|Array $id Unique ID of the item|Item formated as array|Array of items
* -参数 字符串|数组 $id item的唯一id | Item格式化成数组 | items 数组
* @param string $name Name of the item
* -参数 字符串 $name item 名称
* @param int $qty Item qty to add to the cart
* -param int $qty 添加到购物车的item的数量
* @param float $price Price of one item
* -param float $price item 价格
* @param Array $options Array of additional options, such as 'size' or 'color'
* @param Array $options 附加参数数组, 诸如'size' 或 'color'
*/
// Basic form 基础表单
Cart::add('293ad', 'Product 1', 1, 9.99, array('size' => 'large'));
// Array form 数组表单
Cart::add(array('id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 9.99, 'options' => array('size' => 'large')));
// Batch method 批量方法
Cart::add(array(
array('id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 10.00),
array('id' => '4832k', 'name' => 'Product 2', 'qty' => 1, 'price' => 10.00, 'options' => array('size' => 'large'))
));
~~~
~~~
#### Cart:update()
~~~
~~~
/**
* Update the quantity of one row of the cart
*
* @param string $rowId The rowid of the item you want to update
* @param integer|Array $attribute New quantity of the item|Array of attributes to update
* @return boolean
*/
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
Cart::update($rowId, 2);
OR
Cart::update($rowId, array('name' => 'Product 1'));
~~~
~~~
#### Cart::remove()
~~~
~~~
/**
* Remove a row from the cart
*
* @param string $rowId The rowid of the item
* @return boolean
*/
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
Cart::remove($rowId);
~~~
~~~
#### Cart::get()
~~~
~~~
/**
* Get a row of the cart by its ID
*
* @param string $rowId The ID of the row to fetch
* @return CartRowCollection
*/
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
Cart::get($rowId);
~~~
~~~
#### Cart::content()
~~~
~~~
/**
* Get the cart content
*
* @return CartCollection
*/
Cart::content();
~~~
~~~
#### Cart::destroy()
~~~
~~~
/**
* Empty the cart 清空购物车
*
* @return boolean
*/
Cart::destroy();
~~~
~~~
#### Cart:total()
~~~
~~~
/**
* Get the price total 获取总价格
*
* @return float
*/
Cart::total();
~~~
~~~
#### Cart:count()
~~~
~~~
/**
* Get the number of items in the cart
*
* @param boolean $totalItems Get all the items (when false, will return the number of rows)
* @return int
*/
Cart::count(); // Total items
Cart::count(false); // Total rows
~~~
~~~
#### Cart::search()
~~~
~~~
/**
* Search if the cart has a item
*
* @param Array $search An array with the item ID and optional options
* @return Array|boolean
*/
Cart::search(array('id' => 1, 'options' => array('size' => 'L'))); // Returns an array of rowid(s) of found item(s) or false on failure
~~~
~~~
#### Collections
显而易见,`Cart::content()`和`Cart::get()`返回一个集合,`CartCollection`和`CartRowCollection`。
这些集合扩展了原始的`Laravel 4`的`collection`类,所以这个类的所有方法同样的可以被使用在购物车类中。
### 实例
现在扩展包可以支持多个购物车实例,工作方式像这样:
你可以使用`Cart::instance(‘newInstance’)`设置当前的购物车实例,此刻,有效的购物车实例是`newInstance`,所以你添加、移除或获取购物车内容,操作的都是`newInstance`。如果你需要选择其它实例,你只需要调用`Cart::instance(‘otherInstance’)`
~~~
~~~
Cart::instance('shopping')->add('192ao12', 'Product 1', 1, 9.99);
// Get the content of the 'shopping' cart
Cart::content();
Cart::instance('wishlist')->add('sdjk922', 'Product 2', 1, 19.95, array('size' => 'medium'));
// Get the content of the 'wishlist' cart
Cart::content();
// If you want to get the content of the 'shopping' cart again...
Cart::instance('shopping')->content();
// And the count of the 'wishlist' cart again
Cart::instance('wishlist')->count();
~~~
~~~
> 备注1:如果你不重新设置,购物车永远是最后一个实例
> 备注2:默认的购物车实例名称是mian,所以Cart::content();等同于Cart::instance(‘main’)->content()。
### Models
一个新特性是可以使为购物车的item关联一个模型。假设在你的应用中有一个product模型,通过新的`associate()`方法,可以通知购物车里的项关联到product模型。
这样你可以从 `CartRowCollection` 访问你的模型。
下面是一个示例:
~~~
~~~
<?php
/**
* Let say we have a Product model that has a name and description.
*/
Cart::associate('Product')->add('293ad', 'Product 1', 1, 9.99, array('size' => 'large'));
$content = Cart::content();
foreach($content as $row)
{
echo 'You have ' . $row->qty . ' items of ' . $row->product->name . ' with description: "' . $row->product->description . '" in your cart.';
}
~~~
~~~
访问模型的主键和关联模型的名称相同。associate()还有第二个参数,是可选的,用于指定模型的命名空间。
### 异常错误
当发生错误时,购物车模块将抛出异常。使用购物车模块可以很容易的调试错误,或者基于异常的类型处理错误。购物车模块可以抛出以下异常:
| Exception | Reason |
|-----|-----|
| ShoppingcartInstanceException | When no instance is passed to the instance() method 没有实例传递给instance()方法 |
| ShoppingcartInvalidItemException | When a new product misses one of it’s arguments (id,name, qty, price) 当新产品缺少一个参数 |
| ShoppingcartInvalidPriceException | When a non-numeric price is passed当非数值的价格被传递 |
| ShoppingcartInvalidQtyException | When a non-numeric quantity is passed当非数值的数量被传递 |
| ShoppingcartInvalidRowIDException | When the $rowId that got passed doesn’t exists in the current cart当当前的购物车并不存在被传来的$roeid |
| ShoppingcartUnknownModelException | When an unknown model is associated to a cart row当一个未知的模型被关联到购物车的行 |
### Events
下面是购物车监听的事件:
| Event | Fired |
|-----|-----|
| cart.add($item) | When a single item is added当单个item被添加 |
| cart.batch($items) | When a batch of items is added当一批item被添加 |
| cart.update($rowId) | When an item in the cart is updated购物车单个item跟更新 |
| cart.remove($rowId) | When an item is removed from the cart当一个item被从购物车中移除 |
| cart.destroy() | When the cart is destroyed当购物车被清空 |
#### 示例:
下面的示例展示了如果在table中呈现购物车的内容
~~~
~~~
// Controller
Cart::add('192ao12', 'Product 1', 1, 9.99);
Cart::add('1239ad0', 'Product 2', 2, 5.95, array('size' => 'large'));
// View
<table>
<thead>
<tr>
<th>Product</th>
<th>Qty</th>
<th>Item Price</th>
<th>Subtotal</th>
</tr>
</thead>
<tbody>
<?php foreach($cart as $row) :?>
<tr>
<td>
<p><strong><?php echo $row->name;?></strong></p>
<p><?php echo ($row->options->has('size') ? $row->options->size : '');?></p>
</td>
<td><input type="text" value="<?php echo $row->qty;?>"></td>
<td>$<?php echo $row->price;?></td>
<td>$<?php echo $row->subtotal;?></td>
</tr>
<?php endforeach;?>
</tbody>
</table>
~~~
~~~
原文地址:[](http://www.zhangxihai.cn/archives/189)[http://www.zhangxihai.cn/archives/189](http://www.zhangxihai.cn/archives/189)
- 前言
- 发行说明/L5新特性
- 升级向导
- 升级到 5.0.16
- 从 4.2 升级到 5.0
- 从 4.1 升级到 4.2
- 从 4.1.x 升级到 4.1.29
- 从 4.1.25 升级到 4.1.26
- 从 4.0 升级到 4.1
- 贡献向导
- 环境配置
- 安装
- 配置
- 基本功能
- 路由
- 基本路由
- CSRF 保护
- 方法欺骗
- 路由参数
- 命名路由
- 路由群组
- 路由模型绑定
- 抛出 404 错误
- 中间件
- 建立中间件
- 注册中间件
- 可终止中间件
- 控制器
- 基础控制器
- 控制器中间件
- 隐式控制器
- RESTful 资源控制器
- 请求
- 取得请求实例
- 取得输入数据
- 旧输入数据
- Cookies
- 上传文件
- 其他的请求信息
- 响应
- 基本响应
- 重定向
- 其他响应
- 响应宏
- 系统架构
- 服务提供者
- 基本提供者例子
- 注册提供者
- 缓载提供者
- 服务容器
- 基本用法
- 将接口绑定到实现
- 上下文绑定
- 标签
- 实际应用
- 容器事件
- 参考:理解PHP 依赖注入|Laravel IoC容器
- Contracts
- 为什么用 Contracts
- Contract 参考
- 如何使用 Contracts
- Facades
- 实际用法
- 建立 Facades
- 模拟 Facades
- Facade 类参考
- 请求的生命周期
- 生命周期概要
- 聚焦于服务提供者
- 应用程序结构
- 根目录
- App 目录
- 为应用程序配置命名空间
- 系统服务
- 认证
- 用户认证
- 取得经过认证的用户
- 保护路由
- HTTP 基本认证
- 忘记密码与重设
- 第三方登陆认证
- 交易
- 配置文件
- 订购方案
- 一次性付款
- Single Charges
- 免信用卡试用
- 订购转换
- 订购数量
- 取消订购
- 恢复订购
- 确认订购状态
- 处理失败订阅
- 处理其它 Stripe Webhooks
- 收据
- 缓存
- 配置
- 缓存用法
- 递增与递减
- 缓存标签
- 缓存事件
- 数据库缓存
- 集合
- Command Bus
- 建立命令
- 调用命令
- 命令队列
- 命令管道
- 核心扩展
- 管理者和工厂
- 缓存
- Session
- 认证
- 基于服务容器的扩展
- Laravel Elixir
- 安装与配置
- 使用方式
- Gulp
- Custom Tasks and Extensions
- 加密
- Envoy 任务执行器
- 安装
- 执行任务
- 多服务器
- 并行执行
- 任务宏
- 通知
- 更新 Envoy
- 错误与日志
- 配置
- 错误处理
- HTTP 异常
- 日志
- 事件
- 基本用法
- 事件处理队列
- 事件订阅者
- 文件系统与云存储
- 配置文件
- 基本用法
- 自定义文件系统
- 哈希
- 基本用法
- 辅助方法
- 数组
- 路径
- 路由
- 字符串
- 网址(URL)
- 其他
- 本地化
- 语言文件
- 基本用法
- 复数
- 验证
- 覆写扩展包的语言文件
- 邮件
- 配置
- 基本用法
- 内嵌附件
- 邮件队列
- 邮件与本地端开发
- 扩展包开发
- 视图
- 语言
- 配置文件
- 公共资源
- 发布分类文件
- 路由
- 分页
- 配置
- 使用
- 追加分页链接
- 转换至 JSON
- 队列
- 设置
- 基本用法
- 队列闭包
- 执行一个队列监听
- 常驻队列处理器
- 推送队列
- 已失败的工作
- 会话
- 配置
- 使用 Session
- 暂存数据(Flash Data)
- 数据库 Sessions
- Session 驱动
- 模板
- Blade 模板
- Blade 控制语法结构
- Blade 扩展
- 参考:@section与@yield 介绍
- 单元测试
- 定义并执行测试
- 测试环境
- 从测试调用路由
- 模拟 Facades
- 框架 Assertions
- 辅助方法
- 重置应用程序
- 表单验证
- 基本用法
- 控制器验证
- 表单请求验证
- 使用错误信息
- 错误信息 & 视图
- 可用验证规则
- 条件验证规则
- 自定义错误信息
- 自定义验证规则
- 数据库
- 使用基础
- 配置
- 读取/写入连接
- 执行查找
- 数据库事务处理
- 获取连接
- 日志记录
- 查询构造器
- Selects
- Joins
- 高级 Wheres
- 聚合
- 原生表达式
- 添加
- 更新
- 删除
- Unions
- 悲观锁定 (Pessimistic Locking)
- Eloquent ORM
- 基本用法
- 批量赋值
- 新增,更新,删除
- 软删除
- 时间戳
- 范围查询
- Global Scopes
- 关联
- 关联查询
- 预载入
- 新增关联模型
- 更新上层时间戳
- 使用枢纽表
- 集合
- 获取器和修改器
- 日期转换器
- 属性类型转换
- 模型事件
- 模型观察者
- 模型 URL 生成
- 转换成数组 / JSON
- 结构生成器
- 建立与删除数据表
- 加入字段
- 修改字段
- 修改字段名称
- 移除字段
- 检查是否存在
- 加入索引
- 外键
- 移除索引
- 移除时间戳记和软删除
- 保存引擎
- 迁移和数据填充
- 建立迁移文件
- 执行迁移
- 回滚迁移
- 数据填充
- Redis
- 配置
- 使用方式
- 管道
- 开发包
- Confide 用户身份认证
- Entrust 权限管理
- Shoppingcart 购物车
- Genertators 代码生成工具
- IDE Helper IDE助手
- Artisan 命令行工具
- 概览
- 用法
- 在命令行接口以外的地方调用命令
- 定时调用 Artisan 命令
- 开发
- 建立自定义命令
- 注册自定义命令
- CoverPage