Я изучаю Symfony 4 прямо сейчас, и я наткнулся на эту документацию о загрузке файлов на странице контроллера, которую я запутал.
public function new(Request $request)
{
$product = new Product();
$form = $this->createForm(ProductType::class, $product);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $file stores the uploaded PDF file
/** @var Symfony\Component\HttpFoundation\File\UploadedFile $file */
$file = $product->getBrochure();
При отправке формы $ файл использовался для хранения содержимого загруженного файла, как указано в аннотации. Но какой смысл в этом $ продукт-> getBrochure ()? $ продукт не должен содержать ничего внутри, поскольку он был недавно создан из сущности Product.




В вашем контроллере вы создаете форму с базовым объектом для хранения данных, которые являются сущностью продукта. Доступ к контроллеру можно получить двумя способами.
сначала в методе GET без каких-либо данных формы, а затем в методе POST с данными из полей формы. В Symfony данные из полей формы будут автоматически помещаться в вашу сущность и даже автоматически проверяться. Все бывает с линией
$form->handleRequest($request);
Таким образом, данные загруженного файла также хранятся в объекте, и если вы хотите получить к нему доступ, вам придется получить его из объекта с помощью общедоступного метода, такого как $ product-> getBrochure ();
Это кажется странным, потому что вы новичок в Symfony. Позже вы откроете для себя силу сущностей и привыкнете к такому поведению. Разве загрузка файлов уже не является чем-то необычным в PHP?
Кажется, что документация на странице загрузки файлов Symfony 4 неверна. Возможно, для вас это немного поздно, но проблема все еще существует. Вместо того, чтобы использовать:
$file = $product->getBrochure();
использовать:
$file = $form['brochure']->getData();
Первый вернет имя файла, которое является строкой, а второй - сам файл.
Эти неявные действия кажутся мне такими странными. Но разве в приведенной выше аннотации еще нет файла $?