一个例子理解ThinkPHP的MVC三层结构实现过程

3 篇文章 0 订阅
3 篇文章 0 订阅

1、Model层

在Model层,需要定义一个GoodsModel类,用来处理与商品表(goods)相关的数据操作,包括商品详情展示、商品加入购物车、商品关联订单、商品关联仓库等功能。下面是一个简单的示例代码:

namespace app\model;
use think\Model;

class GoodsModel extends Model
{
    protected $table = 'goods';

    /**
     * 获取商品详情
     * @param int $id 商品ID
     * @return mixed|null
     */
    public function getGoodsDetail($id)
    {
        return $this->where('id', $id)->find();
    }

    /**
     * 将商品加入购物车
     * @param int $userId 用户ID
     * @param int $goodsId 商品ID
     * @param int $num 商品数量
     * @return bool
     */
    public function addGoodsToCart($userId, $goodsId, $num)
    {
        // 判断购物车中是否已经存在该商品
        $cartGoods = \app\model\CartModel::where('user_id', $userId)
            ->where('goods_id', $goodsId)
            ->find();

        if ($cartGoods) {
            // 存在,更新商品数量
            $cartGoods->num += $num;
            return $cartGoods->save();
        } else {
            // 不存在,添加商品到购物车
            $cartGoods = new \app\model\CartModel();
            $cartGoods->user_id = $userId;
            $cartGoods->goods_id = $goodsId;
            $cartGoods->num = $num;
            return $cartGoods->save();
        }
    }

    /**
     * 商品关联订单
     * @param int $orderId 订单ID
     * @param array $goodsList 商品列表
     * @return bool
     */
    public function relateOrder($orderId, $goodsList)
    {
        $orderGoodsList = [];
        foreach ($goodsList as $goods) {
            $orderGoods = [
                'order_id' => $orderId,
                'goods_id' => $goods['goods_id'],
                'num' => $goods['num'],
            ];
            $orderGoodsList[] = $orderGoods;
        }

        return \app\model\OrderGoodsModel::insertAll($orderGoodsList);
    }

    /**
     * 商品关联仓库
     * @param int $warehouseId 仓库ID
     * @param int $goodsId 商品ID
     * @param int $num 商品数量
     * @return bool
     */
    public function relateWarehouse($warehouseId, $goodsId, $num)
    {
        // 判断该商品是否已经存在于仓库中
        $warehouseGoods = \app\model\WarehouseGoodsModel::where('warehouse_id', $warehouseId)
            ->where('goods_id', $goodsId)
            ->find();

        if ($warehouseGoods) {
            // 存在,更新商品数量
            $warehouseGoods->num += $num;
            return $warehouseGoods->save();
        } else {
            // 不存在,添加商品到仓库
            $warehouseGoods = new \app\model\WarehouseGoodsModel();
            $warehouseGoods->warehouse_id = $warehouseId;
            $warehouseGoods->goods_id = $goodsId;
			$warehouseGoods->num = $num;
			return $warehouseGoods->save();
		}
	}
}

在上面的代码中,我们通过定义不同的方法实现了不同的商品功能,包括获取商品详情、将商品加入购物车、商品关联订单、商品关联仓库等。

2、Controller层

在Controller层,我们需要定义一个GoodsController类,用来处理与商品相关的HTTP请求,根据用户的请求,调用Model层中相应的方法来处理数据,并返回相应的视图给用户。下面是一个简单的示例代码:

namespace app\controller;

use think\Controller;
use app\model\GoodsModel;

class GoodsController extends Controller
{
    /**
     * 商品详情
     * @param int $id 商品ID
     * @return mixed
     */
    public function detail($id)
    {
        $goodsModel = new GoodsModel();
        $goods = $goodsModel->getGoodsDetail($id);

        return $this->fetch('detail', [
            'goods' => $goods,
        ]);
    }

    /**
     * 将商品加入购物车
     * @param int $goodsId 商品ID
     * @param int $num 商品数量
     * @return mixed
     */
    public function addToCart($goodsId, $num)
    {
        $userId = session('user_id');
        $goodsModel = new GoodsModel();
        $result = $goodsModel->addGoodsToCart($userId, $goodsId, $num);

        if ($result) {
            return $this->success('商品已添加到购物车');
        } else {
            return $this->error('添加失败');
        }
    }

    /**
     * 商品关联订单
     * @param int $orderId 订单ID
     * @param array $goodsList 商品列表
     * @return mixed
     */
    public function relateOrder($orderId, $goodsList)
    {
        $goodsModel = new GoodsModel();
        $result = $goodsModel->relateOrder($orderId, $goodsList);

        if ($result) {
            return $this->success('商品关联订单成功');
        } else {
            return $this->error('商品关联订单失败');
        }
    }

    /**
     * 商品关联仓库
     * @param int $warehouseId 仓库ID
     * @param int $goodsId 商品ID
     * @param int $num 商品数量
     * @return mixed
     */
    public function relateWarehouse($warehouseId, $goodsId, $num)
    {
        $goodsModel = new GoodsModel();
        $result = $goodsModel->relateWarehouse($warehouseId, $goodsId, $num);

        if ($result) {
            return $this->success('商品关联仓库成功');
        } else {
            return $this->error('商品关联仓库失败');
        }
    }
}

在上面的代码中,我们通过定义不同的方法来处理不同的商品HTTP请求,包括商品详情、将商品加入购物车、商品关联订单、商品关联仓库等。

3、View层

在View层,我们需要定义不同的模板文件来展示不同的商品视图,包括商品详情页、购物车页、订单页、仓库页等。下面是一个简单的示例代码:

<!-- 商品详情页 -->
<h1>{$goods.name}</h1>
<p>{$goods.desc}</p>
<p>价格:{$goods.price}</p>

<!-- 加入购物车 -->
<form action="{:url('goods/addToCart')}" method="post">
    <input type="hidden" name="goods_id" value="{$goods.id}">
    <input type="number" name="num" value="1">
    <button type="submit">加入购物车</button>
</form>

<!-- 订单页 -->
<h1>订单详情</h1>
<table>
    <thead>
        <tr>
            <th>商品名称</th>
            <th>商品数量</th>
        </tr>
    </thead>
    <tbody>
        {foreach $goodsList as $goods}
            <tr>
                <td>{$goods.name}</td>
                <td>{$goods.num}</td>
            </tr>
        {/foreach}
    </tbody>
</table>

<!-- 仓库页 -->
<h1>仓库详情</h1>
<table>
    <thead>
        <tr>
            <th>商品名称</th>
            <th>商品数量</th>
        </tr>
    </thead>
    <tbody>
        {foreach $goodsList as $goods}
            <tr>
                <td>{$goods.name}</td>
                <td>{$goods.num}</td>
            </tr>
        {/foreach}
    </tbody>
</table>

在上面的代码中,我们通过不同的模板文件来展示不同的商品视图,包括商品详情页、订单页、仓库页等。

综上所述,通过MVC三层结构来实现一个商品类,我们可以更好地组织代码,提高代码复用性,让代码更加清晰易懂。同时,MVC也是目前最流行的Web开发架构之一,通过学习MVC,可以更好地理解Web开发中的各种概念和设计原则,提高自己的开发水平。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ThinkPHP的DAO层中,可以通过建立一个公共的基类来实现增删改查的功能。 首先,在DAO层中建立一个BaseDao类,该类包含了通用的增删改查操作。例如: ``` namespace app\common\dao; use think\Db; class BaseDao { protected $table; // 数据表名 public function __construct($table) { $this->table = $table; } // 新增记录 public function create($data) { Db::table($this->table)->insert($data); } // 删除记录 public function delete($condition) { Db::table($this->table)->where($condition)->delete(); } // 更新记录 public function update($condition, $data) { Db::table($this->table)->where($condition)->update($data); } // 查询单条记录 public function findOne($condition) { return Db::table($this->table)->where($condition)->find(); } // 查询多条记录 public function findAll($condition) { return Db::table($this->table)->where($condition)->select(); } } ``` 然后,在其他DAO类中继承BaseDao类,就可以直接调用BaseDao中的增删改查方法。例如,在UserDao中继承BaseDao类: ``` namespace app\common\dao; class UserDao extends BaseDao { public function __construct() { parent::__construct('user'); // 数据表名为user } } ``` 这样,通过调用UserDao中继承自BaseDao的方法,就可以实现对user表的增删改查操作。例如: ``` $userDao = new UserDao(); // 新增记录 $data = ['name' => 'Tom', 'age' => 20]; $userDao->create($data); // 删除记录 $condition = ['id' => 1]; $userDao->delete($condition); // 更新记录 $condition = ['id' => 2]; $data = ['name' => 'Jerry']; $userDao->update($condition, $data); // 查询单条记录 $condition = ['id' => 2]; $user = $userDao->findOne($condition); // 查询多条记录 $condition = ['age' => ['>=', 18]]; $users = $userDao->findAll($condition); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP程序员的自我修养

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值