实际工作中的yii2到底有哪些部分会与原生的不同?scenarios

大多数公司,除了特别有实力的会用自己的框架,一般来说,通常会选择对常用的框架进行一定的改变来更好的适应本公司的业务。结果,上次我跟别人讨论自己公司到底改了些什么,胡扯了一堆,才发现自己压根没有研究过自己最常用的代码到底为何而改。所以这次有空的时候,我会逐渐总结下的好。

form 这个是大头

教程 url http://www.yiichina.com/doc/guide/2.0/structure-models

scenarios 场景

正常使用
本意是用来区别一个ctrl中各个action对于form的项目不同需求,而且还有各种rules的改变

namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord
{
    const SCENARIO_LOGIN = 'login';
    const SCENARIO_REGISTER = 'register';

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios[self::SCENARIO_LOGIN] = ['username', 'password'];
        $scenarios[self::SCENARIO_REGISTER] = ['username', 'email', 'password'];
        return $scenarios;
    }
}

实际当中 ,在n个ctrl的form中,
a 负责验证的ctrl是得到coretoken的,只需要后面4个,外加自定义1个
b 其他的ctrl都是用其中5个项目,外加自定义项目若干

            'coreToken',
            'storeType',
            'productName',
            'aplVersion',
            'osVersion'

又因为其他form的自定义的东西的关系(后面会说分不开的原因),没法分开,于是只能用了scenarios
在父类里定义

    public function scenarios() {

        $scenarios = parent::scenarios();
        $scenarios[CommonController::GET_CORE_TOKEN] = [
            'storeType',
            'productName',
            'aplVersion',
            'osVersion'
        ];
        $scenarios[parent::SCENARIO_DEFAULT] = [
            'coreToken',
            'storeType',
            'productName',
            'aplVersion',
            'osVersion'
        ];
        return $scenarios;
    }

针对其中的a,
ctrl中定义场景

        if ($oAction->controller->id === self::GET_CORE_TOKEN) {
            $this->oPassForm->setScenario(self::GET_CORE_TOKEN);
        }

在其中第一个form里定义

    public function scenarios() {

        $scenarios = parent::scenarios();
        $scenarios[parent::SCENARIO_DEFAULT][] = 'myToken'; //利用原来的4个,再加上一个自定义的
        return $scenarios;
    }

针对其中的b ,继承父类的,然后再加4个

    public function scenarios() {

        $scenarios = parent::scenarios();
        $scenarios[parent::SCENARIO_DEFAULT] = array_merge($scenarios[parent::SCENARIO_DEFAULT], [
            'limitDataNum',
            'offset',
            'sort',
            'deleteExcludeFlag'
        ]);
        return $scenarios;
    }

思考

attributeLabels也要先继承父类,然后再添加自己的自定义项目。

这么做的好处,在于将共同的4-5个项目集中到了一处,避免了各个子form重复copy的结果
坏处是,每个子form中都要重新merge一遍父类的场景,再加上自定义的各个项目,在增加自定义项目的过程中,容易拼写错误。

但是还有更好的办法吗?我暂时没有

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,445评论 25 709
  • Day 8 跃迁 摘抄 管理学中有一句话叫做,不要以战术上的勤奋掩饰战略上的懒惰,这句话的意思,有些做企业的创始人...
    赵三多阅读 1,527评论 1 1
  • 中国的酒文化源远流长,酒被赋予了礼仪,社交,休闲等含义,体现了中国古代特定的宗法秩序和人伦关系,酒是中国文化...
    长袜子梅梅阅读 6,457评论 1 5
  • 宁风已经吹响,战争前夕中的交响曲于树林中回荡。建筑间呼啸的风带过,大有风雨欲来之势。 本是白天可现在竟好似笼了一层...
    李珏J阅读 1,768评论 0 0
  • 本文为 Rinchy 关于 REMOTE 的原创,著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明...
    Rinchy阅读 4,117评论 0 0