Новое в Symfony 7.1: Атрибут MapUploadedFile
- Pull Request: [HttpKernel] Introduce
#[MapUploadedFile]
controller argument attribute #49978 Renê Lima
В 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