2016-07-03 01:28:50 7672次浏览 3条回答 2 悬赏 10 金钱

最近在学习yii框架,但是场景和规则这个地方有点弄混了,如图A.jpg

如图,在规则rules中设定字段a和字段b,当场景为update的时候触发,但是在设置场景update的时候我选择了字段a和b以及c,那么在程序中当时执行场景update的时候,字段c会做校验码?

最佳答案

  • yidashi 发布于 2016-07-03 14:57 举报

    校验。你设置这个意思是只有update场景时候,才去校验你第二条规则,其他场景只校验第一条

    3 条回复
    回复于 2016-07-03 15:11 回复

    那场景里面$scenarios['update'] = ['a','b','c']; 这是什么意思呢

    回复于 2016-07-03 15:37 回复

    这跟那个on是类似的。update场景下只校验abc,def不校验,哪怕第一条里有def。结合你这个例子,就是update场景下校验abc属性,c是数字,ab是最长120的字符串。假如你那个on => update前边是a,d,那就是校验c是数字,a是最长120的字符串。。。。解释好累

    回复于 2017-02-08 11:29 回复

    解释的有点繁琐了,其实就是 ,场景制定就相当与一个二手准备,有意外了才会走这个二手准备,如果没意外,就正常验证

    觉得很赞
  • 回答于 2016-07-04 10:17 举报

    您的答案 C 是會驗證的 , 欄位跟場景是不同的

    下面舉些例子看看差別

    首先預設參數

    $arr = [
    	'a' => 'string',
    	'b' => 'string',
    	'c' => 'default'
    ];
    

    單驗證欄位
    1.

    public function rules()
    {
    	return [
    		[['a'], 'string'],
    		[['b', 'c'], 'integer']
    	];
    }
    
    $model->attributes = $arr;
    $model->validate();
    
    驗證 a 正確
    驗證 b 錯誤 應該為整數
    驗證 c 錯誤 應該為整數
    

    加入場景 scenario_a , scenario_b

    1.

    public function rules()
    {
    	return [
    		[['a'], 'string'],
    		[['b'], 'integer', 'on' => 'scenario_a'],	只讓場景 scenario_a 驗證
    		[['c'], 'integer']
    	];
    }
    
    $model->attributes = $arr;
    $model->validate();
    
    驗證   a 正確
    未驗證 b 正確 因為只驗證 a,c 欄位
    驗證   c 錯誤 應該為整數
    

    1-1.

    public function rules()
    {
    	return [
    		[['a'], 'string'],
    		[['b'], 'integer', 'on' => 'scenario_a'],	只讓場景 scenario_a 驗證
    		[['c'], 'integer']
    	];
    }
    
    $model->scenario = 'scenario_a';
    $model->attributes = $arr;
    $model->validate(); 
    
    驗證  a 正確
    驗證  b 錯誤 應該為整數  因為場景選擇 scenario_a
    驗證  c 錯誤 應該為整數
    

    指定驗證欄位
    2.

    public function rules()
    {
    	return [
    		[['a'], 'string'],
    		[['b'], 'integer', 'on' => 'scenario_a'],	只讓場景 scenario_a 驗證
    		[['c'], 'integer']
    	];
    }
    
    public function scenarios()
    {
    	$scenarios = parent::scenarios();
    	$scenarios['scenario_a'] = ['a', 'b'];		場景 scenario_a 只驗證 a,b 欄位
    	$scenarios['scenario_b'] = ['a', 'b', 'c'];	場景 scenario_b 只驗證 a,b,c 欄位
    	return $scenarios;
    }
    

    2-1

    $model->attributes = $arr;
    $model->validate();       
    
    驗證    a 正確
    未驗證  b 錯誤 應該為整數
    驗證    c 錯誤 應該為整數
    

    2-2

    $model->scenario = 'scenario_a';
    $model->attributes = $arr;
    $model->validate();
    
    驗證    a 正確
    驗證    b 錯誤 應該為整數
    未驗證  c 
    

    2-3

    $model->scenario = 'scenario_b';
    $model->attributes = $arr;
    $model->validate();         
    
    驗證   a 正確
    未驗證 b 因為 b 屬於場景 scenario_a 
    驗證   c 錯誤 應該為整數
    
    4 条回复
    回复于 2016-11-18 01:06 回复

    你这个代码测试过吗,我测试的结果2-2和2-3好像是错的。2-2的结果是:abc都验证。2-3的结果是abc都不验证

    回复于 2016-11-18 10:11 回复

    @paopao2hao
    2-2 不可能都驗證 因為scenario_a 已經設定指驗證 a, b
    2-3 不可能都不驗證 因為scenario_b 已經設定指驗證 a, b, c , 但 b 的rules 是綁在 scenario_a , 所以只會驗證 a, c

    • 剛剛測試過了, 是成功的!! 不知道您是哪輸入出問題!
    • 1 跟 2 的差別在於多了 scenarios 設定請你在確認看看代碼巴
    回复于 2016-11-18 23:58 回复

    您好,最近在学习场景,看到你的评论很受益,我按照的你例子测试了一下,跟你的结果有很大出入,请指教。我的代码如下:
    TestModel.php
    <?php
    namespace frontend\models;
    use yii\base\Model;
    class TestModel extends Model
    {

    public $a;
    public $b;
    public $c;
    
    public function rules(){
    	return [
    		[['a'], 'integer'],
    		[['b'], 'integer', 'on' => 'scenario_b'],	
    		[['c'], 'integer']
    	];
    }
    
    public function scenario(){
    	$scenarios = parent::scenarios();
    	$scenarios['scenario_a'] = ['a', 'b'];		
    	$scenarios['scenario_b'] = ['a', 'b', 'c'];
    	return $scenarios;	
    }
    

    }

    TestController.php
    <?php
    namespace frontend\controllers;
    use yii\web\controller;
    use frontend\models\TestModel;
    class TestController extends Controller{

    public function actionTest(){
    	$model=new TestModel;
    	$arr=[
    		'a' => 'string',
    		'b' => 'string',
    		'c' => 'default'
    	];
    	$model->attributes=$arr;
    	print_r($model->attributes);
    	$model->scenario='scenario_b';
        if($model->validate()){
            echo '验证通过';
        }else{
            echo '验证未通过';print_r($model->errors);
        }
    }
    

    }
    不知道我的测试代码是否正确?请指点

    回复于 2016-11-20 21:22 回复

    不好意思,仔细检查了半天发现是我的scenario方法名少了个s,您的结论是对的,受益匪浅!!!

    觉得很赞
  • 回答于 2016-07-11 18:48 举报

    'on'就是在它指定的场景下使用。可以考虑这样:

    public function scenarios()
    {
       return [
          'scenarion1'=>[.........(当使用这个场景时,里面包含的属性才会被返回)],
         ]
    }
    模型初始化指定场景名:new ..(['scenario'=>'....']);
    
您需要登录后才可以回答。登录 | 立即注册
tyx
职场新人

tyx

注册时间:2015-09-18
最后登录:2016-08-11
在线时长:3小时3分
  • 粉丝1
  • 金钱49
  • 威望0
  • 积分79

热门问题