大多数公司,除了特别有实力的会用自己的框架,一般来说,通常会选择对常用的框架进行一定的改变来更好的适应本公司的业务。结果,上次我跟别人讨论自己公司到底改了些什么,胡扯了一堆,才发现自己压根没有研究过自己最常用的代码到底为何而改。所以这次有空的时候,我会逐渐总结下的好。
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一遍父类的场景,再加上自定义的各个项目,在增加自定义项目的过程中,容易拼写错误。
但是还有更好的办法吗?我暂时没有