Php Yii2 FileInput-尝试获取非对象的属性

Php Yii2 FileInput-尝试获取非对象的属性,php,yii2,yii2-advanced-app,Php,Yii2,Yii2 Advanced App,我使用的是Yii2和Kartik的FileInput扩展名,我已经成功地完成了文件上传(仅一次上传)。我现在的问题是,如果我没有选择任何文件(它应该是可选的),我会得到标题中的错误(附带日志) 在互联网上进行了大量搜索之后,我认为这与数组有关,但我不确定如何修复它,尤其是当日志指向确切的行时 这是我的日志 这是我的模型, namespace app\models; use Yii; class FormMovement extends \yii\db\ActiveRecord {

我使用的是Yii2和Kartik的FileInput扩展名,我已经成功地完成了文件上传(仅一次上传)。我现在的问题是,如果我没有选择任何文件(它应该是可选的),我会得到标题中的错误(附带日志)

在互联网上进行了大量搜索之后,我认为这与数组有关,但我不确定如何修复它,尤其是当日志指向确切的行时

这是我的日志

这是我的模型,
namespace app\models;

use Yii;

class FormMovement extends \yii\db\ActiveRecord
{

    public $file;

    public static function tableName()
    {
        return 'form_movement';
    }

    public function rules()
    {
        return [
            [['fm_date_received', 'fm_form_name', 'fm_from', 'fm_ptj'], 'required'],
            [['form_id'], 'integer'],
            [['fm_date_received', 'fm_date_action1', 'fm_date_action2','fm_upload'], 'safe'],
            [['fm_form_name', 'fm_note'], 'string', 'max' => 500],
            [['fm_from', 'fm_ptj', 'fm_action1', 'fm_action2'], 'string', 'max' => 100],
            [['file'], 'file', 'skipOnEmpty' => true, 'extensions'=>'jpg,pdf,png,doc,docx,xls,xlsx, jpeg', 'maxFiles' => 3],
        ];
    }
我的控制器功能,日志显示它在第75行,就是这一行

$model->fm_upload='uploads/'.$fileName.'.'.$model->file->extension;
我一直在修补它,但没有成功

public function actionCreate()
    {
        $model = new FormMovement();

        if ($model->load(Yii::$app->request->post())) {

            //set the file name
            $fileName = $model -> fm_form_name;

            //get instance
            $model->file = UploadedFile :: getInstance($model, 'file');

            //set the file path in the db
            $model->fm_upload='uploads/'.$fileName.'.'.$model->file->extension;

            //save the file to the server directory
            $model->save();
            $model->file->saveAs('uploads/'.$fileName.'.'.$model->file->extension);

            return $this->redirect(['view', 'id' => $model->form_id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }
最后我的看法是,

<div class="form-group kv-fieldset-inline">
    <?= Html::activeLabel($model, 'file[]', [
            'label'=>'MUAT NAIK FAIL',
            'class'=>'col-sm-1 control-label'
        ]) ?>

    <div class="col-sm-8">
    <?= $form->field($model, 'file',[
                'showLabels'=>false
            ])->widget(FileInput::classname(), [
            'options' => ['accept' => 'file/*', 'multiple' => 'true'],
            'pluginOptions'=>[
                'showUpload' => false,
            ]
    ]) ?>
    </div>
</div>

应重构此部分:

//set the file name
$fileName = $model -> fm_form_name;

//get instance
$model->file = UploadedFile :: getInstance($model, 'file');

//set the file path in the db
$model->fm_upload='uploads/'.$fileName.'.'.$model->file->extension;

//save the file to the server directory
$model->save();
$model->file->saveAs('uploads/'.$fileName.'.'.$model->file->extension);
像这样:

$model->file = UploadedFile::getInstance($model, 'file');
$model->save();

if ($model->file) {    
    $model->fm_upload = "uploads/{$model->fm_form_name}.{$model->file->extension}";    
    $model->file->saveAs("uploads/{$model->fm_form_name}.{$model->file->extension}");
}
还要注意的是,您根本不会在控制器中处理失败的验证

对于进一步的重构,这一行:

$model->file = UploadedFile::getInstance($model, 'file');
可以移动到
beforeValidate()
事件处理程序

本部分:

if ($model->file) {    
    $model->fm_upload = "uploads/{$model->fm_form_name}.{$model->file->extension}";    
    $model->file->saveAs("uploads/{$model->fm_form_name}.{$model->file->extension}");
}
可以移动到
afterSave()
事件处理程序,以保持控制器苗条


saveAs()
中最好使用alias,我在本文中描述了它。

谢谢!现在它工作得很好!我想我错过了if条件!我还针对您的建议设置了model->validate()D