如何处理与特定属性无关的Yii2 ActiveRecord模型中的通用验证错误?例如,当相关记录/模态设置为非活动状态时,我需要完全禁止保存模型。
我当然可以选择一个或多或少的随机属性并为其分配错误信息,但是如果前端表格没有该属性并且因此没有显示错误怎么办?或者更糟糕的是,如果某个场景稍后禁用该属性的验证(通过不将其包含在活动属性列表中)?
我当然可以在beforeSave()
或beforeValidate()
中返回false,但我没有选择向用户说明为什么模型无法保存的消息,所以我真的不喜欢#39; t喜欢这个想法。
另外,我不想抛出异常,它应该是向用户显示的软错误消息。
处理此问题的目标/最佳方法是什么?
答案 0 :(得分:1)
您是否已查看flash data
他们可用于此目的,以显示<{1}},success
和errors
等 或不是特定于您的模型属性。这取决于你想要使用它们的地方。
我主要在transaction
块中插入数据或保存模型,当我保存多个模型时,我使用try catch块来获取任何模型的错误,并使用会话闪存和ArrayHelper
在flash消息中添加错误。
出于您的目的,您可以通过以下方式使用它。
使用
设置闪光信息warnings
您可以在视图中使用以下内容获取
Yii::$app->session->setFlash('error','you are not allowed to perform this message');
对此更为复杂的方法是\kartik\widgets\AlertBlock
使用composer
安装它if(Yii::$app->session->hasFlash('error')){
echo Yii::$app->session->gettFlash('error');
}
然后使用以下代码
在php composer.phar require kartik-v/yii2-widget-alert "*"
文件夹中创建名为alerts.php
的文件
layouts
然后在use kartik\widgets\AlertBlock;
AlertBlock::widget (
[
'useSessionFlash' => false ,
'type' => AlertBlock::TYPE_GROWL ,
'alertSettings' => [
'settings' => [
'type' => kartik\widgets\Growl::TYPE_SUCCESS ,
'icon' => 'glyphicon glyphicon-ok-sign' ,
'title' => 'Note' ,
'showSeparator' => true ,
'body' => Yii::$app->session->getFlash ( 'success' )
] ,
]
] );
AlertBlock::widget (
[
'useSessionFlash' => false ,
'type' => AlertBlock::TYPE_GROWL ,
'alertSettings' => [
'settings' => [
'type' => kartik\widgets\Growl::TYPE_INFO ,
'icon' => 'glyphicon glyphicon-ok-sign' ,
'title' => 'Note' ,
'showSeparator' => true ,
'body' => Yii::$app->session->getFlash ( 'info' )
] ,
]
] );
AlertBlock::widget (
[
'useSessionFlash' => false ,
'type' => AlertBlock::TYPE_GROWL ,
'alertSettings' => [
'settings' => [
'type' => kartik\widgets\Growl::TYPE_DANGER ,
'icon' => 'glyphicon glyphicon-ok-sign' ,
'title' => 'Note' ,
'showSeparator' => true ,
'body' => Yii::$app->session->getFlash ( 'error' )
] ,
]
] );
AlertBlock::widget (
[
'useSessionFlash' => false ,
'type' => AlertBlock::TYPE_GROWL ,
'alertSettings' => [
'settings' => [
'type' => kartik\widgets\Growl::TYPE_DANGER ,
'icon' => 'glyphicon glyphicon-ok-sign' ,
'title' => 'Note' ,
'showSeparator' => true ,
'body' => Yii::$app->session->getFlash ( 'danger' )
] ,
]
] );
AlertBlock::widget (
[
'useSessionFlash' => false ,
'type' => AlertBlock::TYPE_GROWL ,
'alertSettings' => [
'settings' => [
'type' => kartik\widgets\Growl::TYPE_WARNING ,
'icon' => 'glyphicon glyphicon-ok-sign' ,
'title' => 'Note' ,
'showSeparator' => true ,
'body' => Yii::$app->session->getFlash ( 'warning' )
] ,
]
] );
调用之后将其包含在您的布局文件中
$this->beginBody()
然后你只需要设置flash消息即使你甚至不必调用<?= Yii::$app->view->renderFile ( '@frontend/views/layouts/alerts.php' ); ?>
,扩展程序会自动显示它你有以下变量
使用getFlash()
编辑:
注意:在设置Flash消息后重定向时,请记住使用Yii::$app->session->setFlash('danger','You cannot do this');
和return
,否则可能会遇到消息未显示的问题。
redirect()
编辑2:
您正在尝试为与当前正在保存的模型相关的任何特定模型添加错误消息,并且您需要一些灵活性,允许您抛出异常并在格式错误的消息中显示它们,所以问题你正面临设置错误消息,如果我这样做,我将使用以下方法。假设我在下面有一个return $this->redirect(['index']);
,它会在提交时保存表单。
actionTest()
答案 1 :(得分:0)
然后选择随机属性的另一个选项是抛出具有特定错误代码的异常。使用错误代码常量及其消息创建最终类。然后将您的保存函数调用放入try Catch Block并捕获所有特定异常并将消息返回到前端