PHP 中什么时候用 component 什么时候用 Model,特别迷惑

发布于 2022-09-01 07:38:29 字数 2534 浏览 11 评论 0

开始使用yii2,但是被里面的弄得很迷惑,component 和 model的区别是什么样的。

以下是一些自己的心得,可能有错误,请指正:

1)发现yii2一些规律,在 @app/models/*文件 有2种类型。比如InfoForm这样以Form结尾的文件都是继承自Model,而Info.php这样的表名的文件都是继承自 ActiveRecord 。但疑问的是在github上看到的一些yii2的程序,里面的全部都写在一个Info.php这样的里面。(不过网络上使用yii2开发的开源程序真的是少得可怜,没有研究)

2)component 与 model的区别到底是在哪里?什么情况下该用component 什么情况下该用model?貌似继承自 ActiveRecord 的 Info.php 这样的就只是一个单独的这样文件:

php
<?php namespace app\models; use yii\base\ActiveRecord; class Info extends ActiveRecord { public function static tableName(){ return '{{%my_post}}'; } }

然后就没有写其他的功能代码了,其他的写在这个地方似乎不合适了。

3)接到上面第2点,比如当我要实现用户的积分扣除功能。流程逻辑应该如下吧:

1.先检测用户当前的积分是否充足?如果不充足失败且提示。
2.执行积分扣除
3.成功写入积分变更日志

像第3点这样的,该写在那个文件,特别让人疑惑 /models/Member.php 还是 /models/MemberQuery.php 还是 /components/Member/ScoresUse.php

4)如果真的像 【积分扣除】【用户封禁】这样的功能都制作成单独的组件components,那么ActiveRecord models那么岂不就真的就只剩下第2点里面说的这一段内容的?另外如果真的是这样,那岂不component 变得异常的庞大,但问题是执行【积分扣除】【用户封禁】这样的操作,不是单独某个表的,如果放到 /models/Member.php 里面去执行,需要调用额外的其他表,显然又不符合规范,显得很混乱。

5)比如 【积分扣除】【用户封禁】这样的操作必须可以让正在登陆用户自行调用,又可以让登陆的管理员自行登陆,所以,似乎归类到 model来说完全不适合? 归类到 component 却又还不如直接用 function 单独函数更方便?比如执行 【积分扣除变更】功能:

php/**
 * @description 操作用户积分!
 * @param $mid
 * @param $jftype
 * @param string $tips
 * @param null $jfValue2
 * @return bool
 */
function log_jifen_change($mid, $jftype, $tips = '', $jfValue2 = null)
{
    global $dsql;

    $jfvalue = $jfValue2 && is_numeric($jfValue2) ? $jfValue2 : jifen_value($jftype);

    if ($dsql->ExecuteNoneQuery2("UPDATE #@__member SET scores=scores+'$jfvalue' WHERE mid='" . $mid . "' ")) {

        $rs = $dsql->GetOne("SELECT `scores` FROM `#@__member` WHERE `mid`='{$mid}' ");
        $scoresLeft = $rs['scores'];

        $setarr = array(
            'mid'     => $mid, //会员ID
            'jftype'  => $jftype, //积分代码
            'jftime'  => time(), //操作时间
            'jfvalue' => $jfvalue, //本次变更积分
            'tips'    => $tips, //提示内容
            'jfleft'  => $scoresLeft, //剩余的积分
        );

        $dsql->ExecuteNoneQuery("INSERT INTO gk_member_jflog SET " . MkSetSql($setarr));

        return $scoresLeft;
    }

    return false;
}

PHP中什么时候该用 component 什么时候该用 model?特别让人迷惑。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怎言笑 2022-09-08 07:38:29

真是,一下问这么多问题好难回答。

  1. 先说说什么时候继承 Model 什么时候继承 ActiveRecord?

当一个表单是操作多个表单的时候,建议你新建一个 From,From 只能继承 Model,每个表都要生成 Model,Model 都继承 ActiveRecord。

  1. component 与 model 的区别到底是在哪里?

我认为他们两个没什么关系啊,component 是组件,model 一般映射一个表单或者一个数据库表。

如果你的积分业务比较多,而又比较复杂你可以写成事件,其他地方调用。

最后安利一下:https://github.com/forecho/awesome-yii2

故人如初 2022-09-08 07:38:29

1、当模型本身对应数据库中的表,有数据库查询时继承ActiveRecord(例如User),当本身不涉及到数据库查询时,继承Model(类似LoginForm,它想操作数据只需引用User模型中的方法操作就行,本身不需要)。ActiveRecord继承自Model,扩展了数据库操作的功能。

2、Model继承自Component,扩展了规则,场景,验证等功能,感觉model文件夹下的一般都继承model和activerecord就行了吧,没必要继承component

3、扣除积分的功能,个人认为应该写在积分model中,对于更复杂的,类似购物流程这个,有人建议再增加一个service层,来处理用到多个model的逻辑。

4、5对于组件等只是了解大体原理,没怎么用过,感觉简单的增加积分什么的,用事件只需要在积分model中写入记录时绑定用户model中的修改总积分的事件就可以吧,至于用行为,一般是好多个类通用时才会用到吧。公共的方法类似工具类一般不会涉及到数据库的操作。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文