Новое в Symfony 7.1: Атрибут MapUploadedFile

Источник: «New in Symfony 7.1: MapUploadedFile Attribute»
В Symfony 7.1 появился новый атрибут MapUploadedFile, позволяющий внедрять загруженные файлы в аргументы контроллера.

В Symfony 6.3 мы представили способ сопоставления данных Request с типизированным объектам. В последующих версиях мы улучшили и расширили эту возможность, поэтому в Symfony 7.1 мы вводим новый атрибут #[MapUploadedFile] для сопоставления загруженных файлов с аргументами контроллера.

В следующем примере показан простейший вариант использования, когда атрибут применяется (без каких-либо опций) к аргументу контроллера, чтобы сказать Symfony внедрить в него объект UploadedFile:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Attribute\MapUploadedFile;
use Symfony\Component\Routing\Attribute\Route;

class UserController extends AbstractController
{
// ...

#[Route('/user/picture', methods: ['PUT'])]
public function changeUserPicture(
#[MapUploadedFile] UploadedFile $picture,
): Response
{
// ...
}
}

При загрузке файлов часто требуется подтвердить тип файла и другие его характеристики, например размеры. Атрибут #[MapUploadedFile] позволяет передать список ограничений, которые необходимо применить к файлу:

use Symfony\Component\Validator\Constraints as Assert;
// ...

#[Route('/user/picture', methods: ['PUT'])]
public function changeUserPicture(
#[MapUploadedFile([
new Assert\File(mimeTypes: ['image/png', 'image/jpeg']),
new Assert\Image(maxWidth: 3840, maxHeight: 2160)
])
]

UploadedFile $picture
): Response {
// ...
}

Перед инъекцией UploadedFile в аргумент контроллера проверяются заданные ограничения. Если ограничения нарушены, выбрасывается исключение HttpException и действие контроллера не выполняется.

Наконец, можно внедрить коллекцию файлов, используя вариативный аргумент:

#[MapUploadedFile(new Assert\File(mimeTypes: ['application/pdf']))]
UploadedFile ...$documents

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 7.1: Ограничения MacAddress и Charset

Следующая Статья

MongoDB в Laravel: Краткое руководство для начинающих