При загрузке видео в БД (локальный сервер) возникает ошибка Trying to get property 'name' of non-object YII2
view
<?php \yii\bootstrap4\ActiveForm::begin([
'options' => ['enctype' => 'multipart/form-data']
]) ?>
<button class="btn btn-primary btn-file">
Вибрати файл
<input type="file" id="videoFile" name="video">
</button>
<?php \yii\bootstrap4\ActiveForm::end(); ?>
controller
<?php
namespace backend\controllers;
use common\models\Video;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\UploadedFile;
/**
* VideoController implements the CRUD actions for Video model.
*/
class VideoController extends Controller
{
/**
* @inheritDoc
*/
public function behaviors()
{
return array_merge(
parent::behaviors(),
[
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
]
);
}
/**
* Lists all Video models.
* @return mixed
*/
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => Video::find(),
/*
'pagination' => [
'pageSize' => 50
],
'sort' => [
'defaultOrder' => [
'video_id' => SORT_DESC,
]
],
*/
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Video model.
* @param string $id Video ID
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
/**
* Creates a new Video model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$model = new Video();
$model->video = UploadedFile::getInstancesByName('video');
if (\Yii::$app->request->isPost && $model->save()){
return $this->redirect(['view', 'id' => $model->video_id]);
}
return $this->render('create', ['model' => $model,]);
}
/**
* Updates an existing Video model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param string $id Video ID
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public
function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(\Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->video_id]);
}
return $this->render('update', [
'model' => $model,
]);
}
Model
<?php
namespace common\models;
use Yii;
use yii\helpers\FileHelper;
use yii\web\UploadedFile;
/**
* This is the model class for table "{{%video}}".
*
* @property string $video_id
* @property string $title
* @property string|null $description
* @property string|null $tags
* @property int|null $status
* @property int|null $has_thumbnail
* @property string|null $video_name
* @property int|null $created_at
* @property int|null $updated_at
* @property int|null $created_by
*
* @property User $createdBy
*/
class Video extends \yii\db\ActiveRecord
{
/**
* @var UploadedFile
*/
public $video;
/**
* {@inheritdoc}
*/
public static function tableName()
{
return '{{%video}}';
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['video_id', 'title'], 'required'],
[['description'], 'string'],
[['status', 'has_thumbnail', 'created_at', 'updated_at', 'created_by'], 'integer'],
[['video_id'], 'string', 'max' => 16],
[['title', 'tags', 'video_name'], 'string', 'max' => 512],
[['video_id'], 'unique'],
[['created_by'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['created_by' => 'id']],
];
}
/**
* {@inheritdoc}
*/
public function attributeLabels()
{
return [
'video_id' => 'Video ID',
'title' => 'Title',
'description' => 'Description',
'tags' => 'Tags',
'status' => 'Status',
'has_thumbnail' => 'Has Thumbnail',
'video_name' => 'Video Name',
'created_at' => 'Created At',
'updated_at' => 'Updated At',
'created_by' => 'Created By',
];
}
/**
* Gets query for [[CreatedBy]].
*
* @return \yii\db\ActiveQuery|\common\models\query\UserQuery
*/
public function getCreatedBy()
{
return $this->hasOne(User::className(), ['id' => 'created_by']);
}
/**
* {@inheritdoc}
* @return \common\models\query\VideoQuery the active query used by this AR class.
*/
public static function find()
{
return new \common\models\query\VideoQuery(get_called_class());
}
/**
* @param bool $runValidation
* @param null $attributeNames
* @return bool
*/
public function save($runValidation = false, $attributeNames = null)
{
$isInsert = $this->isNewRecord;
if ($isInsert){
$this->video_id = Yii::$app->security->generateRandomString(8);
$this->title = $this->video->name; // вот здесь в обработчике показывает ошибку
$this->video_name = $this->video->name; // также здесь
}
$saved = parent::save($runValidation, $attributeNames);
if (!$saved){
return false;
}
if ($isInsert){
$videoPath = Yii::getAlias('@frontend/web/storage/videos/'.$this->video_id.'.mp4');
if (!is_dir(dirname($videoPath))){
FileHelper::createDirectory(dirname($videoPath));
}
$this->video->saveAs($videoPath);
}
return true;
}
}
Ответы (1 шт):
Автор решения: Евгений Малеев
→ Ссылка
При передаче данных методом Post, передается не объект, а массив. О чем и сообщает тебе ошибка. Обратитсь так:
$this->title = $this->video['name'];
И сделай var_dump($video); И все увидишь