Я разрабатываю веб-приложение, пытаясь контролировать предложения PHPstan.
У меня возникли некоторые трудности с этим методом:
/**
* AJAX: deletes a work file
*
* @return \Cake\Http\Response|false
*/
public function delete()
{
$this->autoRender = false;
$this->viewBuilder()->setLayout('ajax');
$this->request->allowMethod(['post', 'delete']);
$data = $this->request->getData();
$data = is_array($data) ? $data : [$data];
$workFile = $this->WorkFiles->find('all')
->where(['WorkFiles.id' => $data['id']])
->contain(['Works'])
->first();
$res = [
'status' => 'error',
'message' => __('The file could not be deleted. Please, try again.'),
'class' => 'alert-error',
];
if ($workFile->work->anagraphic_id == $this->authAnagraphics['id']) { // error #1
if ($this->WorkFiles->delete($workFile)) { // error #2
$res = [
'status' => 'success',
'message' => __('File successfully deleted.'),
'class' => 'alert-success',
];
}
}
return $this->response->withStringBody((string)json_encode($res));
}
Сам код работает, но у меня две ошибки phpstan:
[phpstan] Cannot access property $work on array|Cake\Datasource\EntityInterface|null.[phpstan] Parameter #1 $entity of method Cake\ORM\Table::delete() expects Cake\Datasource\EntityInterface, array|Cake\Datasource\EntityInterface|null given.Я делаю что-то неправильно?





Всегда используйте встроенную аннотацию, а затем здесь:
/** @var \App\Model\Entity\WorkFile|null $workFile */
$workFile = $this->WorkFiles->find('all')
->where(['WorkFiles.id' => $data['id']])
->contain(['Works'])
->first();
Но комментарии верны, вы слепо используете возможное нулевое значение впоследствии, поэтому ваш код написан неправильно.
Используйте это вместо этого:
/** @var \App\Model\Entity\WorkFile $workFile */
$workFile = $this->WorkFiles->find('all')
->where(['WorkFiles.id' => $data['id']])
->contain(['Works'])
->firstOrFail();
->first()может возвращать EntityInterface, массив или null. phpstan не знает, какой у вас.null->workне является допустимой конструкцией, как и->delete(null), поэтому он предупреждает вас об этом. По крайней мере, вы должны проверять возвращаемое значение null и выдавать ошибку, иначе используйте->firstOrFail, чтобы было выдано исключение. Я не уверен, какие обстоятельства приводят к тому, что здесь возвращается массив (возможно?), лучше всего для этого просто добавить комментарий PHPDoc, чтобы уточнить, что то, что у вас есть, на самом деле будет объектом сущности.