场景验证不工作 Yii 2

Validation with scenario not working Yii 2

这里的想法是使用 SCENARIO 在两个不同的表中插入参数,首先用他们的参数注册客户,然后注册属于客户的订单,所有这些都在一个表格中。

我正在发送一个带有多个参数的表单,其中一些将用于插入客户使用场景,而其他参数我将按顺序使用(我这样做是为了不必创建两个表单) 参数与 csrf 一起通过 POST 正确发送。

public function createOrder()
{
    //$customer = Customer::find()->where(['email' => $params->email])->limit(1)->asArray()->all();
    $customer = new Customer;
    $customer->load(Yii::$app->request->post());
    $customer->scenario = 'create';
    if($customer->validate()){
        $customer->save();
        vdp($customer);
    } else{
        vdpd($customer->getErrors());
    }

    die;

}

这个returns我是一个数组,表示姓名、电子邮件、地址、单元格、phone、城市等参数不能留空 .

在我的客户模型中:

const SCENARIO_CREATE = 'create';

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_CREATE] = ['name', 'email', 'public_place', 'cell_phone', 'phone', 'city', 'cep', 'state', 'neighborhood', 'number', 'complement'];
    return $scenarios;
}

您需要在 load() 调用之前设置 $scenario。场景定义属性,可以通过 load() 设置,所以你做得太晚了,它没有效果。试试这个:

$customer = new Customer;
$customer->scenario = 'create';
$customer->load(Yii::$app->request->post());

1) createOrder() 在控制器中应该是 actionCreateOrder(),而不是在模型中。

2)

$customer->load(Yii::$app->request->post());
$customer->scenario = 'create';
if ($customer->validate()) {
...

应该是

$customer->scenario = Customer::SCENARIO_CREATE;
if ($customer->load(Yii::$app->request->post()) && $customer->validate()) { ... }

因为 load 方法加载当前场景的属性,并且在加载模型之前不需要 运行 验证。见 example.

3) 在 Customer 模型中为您的属性声明 rules

控制器

public function actionCreateOrder()
{
   $customer = new Customer;
   $customer->setScenario(Customer::SCENARIO_CREATE);
   if($customer->load(Yii::$app->request->post())
      if($customer->save()){
          vdp($customer);
      } else {
          vdpd($customer->getErrors());
      }
   }
   die;
}

型号

const SCENARIO_CREATE = 'create';

public function rules()
{
    return [
       [['name', 'email', 'address'], 'required', 'on' => self::SCENARIO_CREATE], // Add more required fields on 'create' scenario.
       ... // some more rules
    ];
}

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_CREATE] = ['name', 'email', 'public_place', 'cell_phone', 'phone', 'city', 'cep', 'state', 'neighborhood', 'number', 'complement'];
    return $scenarios;
}