场景验证不工作 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;
}
这里的想法是使用 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;
}