Вам не обязательно изменять правила проверки, в качестве альтернативы вы можете использовать объект, реализующий \Psr\Http\Message\UploadedFileInterface
. Проверка загруженного файла по умолчанию в CakePHP поддерживает такие объекты.
CakePHP требует zendframework/zend-diactoros
, поэтому вы можете использовать \Zend\Diactoros\UploadedFile
и делать что-то подобное в своих тестах:
$data = [
// ...
'file' => new \Zend\Diactoros\UploadedFile([
'/path/to/the/temporary/file/on/disk',
1234, // filesize in bytes
\UPLOAD_ERR_OK, // upload (error) status
'filename.jpg', // upload filename
'image/jpeg' // upload mime type
])
];
Правило uploadedFile
автоматически рассматривает такой объект как загруженный файл.
Конечно, ваш код, который обрабатывает загрузку файлов, должен также поддерживать этот интерфейс, но это не так сложно, вам просто нужно убедиться, что обычные массивы загрузки файлов преобразуются в UploadedFileInterface
реализации, чтобы ваш обработчик загрузки мог сделать это требование.
Конечно, это можно сделать в самом обработчике выгрузки, чтобы при валидации использовались обычные массивы выгрузки файлов, а также объекты UploadedFile
. Другим способом было бы преобразовать их ранее при создании сущностей, используя обработчик / событие beforeMarshal
, что-то вроде этого:
public function beforeMarshal(\Cake\Event\Event $event, \ArrayObject $data, \ArrayObject $options)
{
$file = \Cake\Utility\Hash::get($data, 'file');
if ($file === null) {
return;
}
if (!($file instanceof \Psr\Http\Message\UploadedFileInterface)) {
$file = new \Zend\Diactoros\UploadedFile(
\Cake\Utility\Hash::get($file, 'tmp_name'),
\Cake\Utility\Hash::get($file, 'size'),
\Cake\Utility\Hash::get($file, 'error'),
\Cake\Utility\Hash::get($file, 'name'),
\Cake\Utility\Hash::get($file, 'type')
);
$data['file'] = $file;
}
}
Если вы затем используете \Psr\Http\Message\UploadedFileInterface::moveTo()
для перемещения файла, он будет работать как в среде SAPI (на основе браузера), так и в среде, отличной от SAPI (CLI):
try {
$file->moveTo($targetPath);
} catch (\Exception $exception) {
$entity->setError(
'file', [__('The file could not be moved to its destination.')]
);
}
Смотри также