Я использую Symfony 4.1, и мне было трудно заставить относительный / полный путь работать так, как я хочу.
В моей базе данных есть объект Customer с атрибутом photo.
<?php
namespace App\Entity;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Entity\CustomerRepository")
* @ORM\Table("Customer")
*/
class Customer {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", nullable=true)
*
* @Assert\File(mimeTypes={ "image/png","image/jpeg" })
*/
private $photo;
public function getPhoto(): ?string
{
return $this->photo;
}
public function setPhoto(?string $photo): self
{
$this->photo = $photo;
return $this;
}
Это имеет смысл, и когда я сохраняю Заказчика с загрузкой фотографий, он сохраняет фотографию в базе данных и в файловой системе, как я ожидал.
В базе данных для столбца фотографий будет установлено что-то вроде '010925c8c427bddca9020197212b64af.png'
Это то, что я хочу, так что все хорошо.
Проблема возникла, когда я пытался обновить существующую сущность Customer. Customer-> getPhoto () вернет имя файла относительного пути '010925c8c427bddca9020197212b64af.png.'
Но форма не проходит проверку, она говорит, что этот файл не существует.
$em = $this->getDoctrine()->getManager();
$custRepo = $em->getRepository('App:Customer');
$customer = $custRepo->findOneById($id);
$custForm = $this->createForm(CustomerType::class, $customer);
$custForm->handleRequest($request);
if ($custForm->isSubmitted() && $custForm->isValid()) {
$em->flush();
}
Не удалось, потому что проверка не выглядит в каталоге фотографий.
Вот мое решение, которое работает, но кажется слишком хакерским. Я не задавался вопросом, был ли у кого-то более элегантный подход к этому.
$em = $this->getDoctrine()->getManager();
$custRepo = $em->getRepository('App:Customer');
$customer = $custRepo->findOneById($id);
$customer->setPhoto(new File($this->getParameter('photos_dir') .'/' . $customer->getPhoto()));
$custForm = $this->createForm(CustomerType::class, $customer);
$custForm->handleRequest($request);
if ($custForm->isSubmitted() && $custForm->isValid()) {
$photoPathParts = explode('/', $customer->getPhoto());
$customer->setPhoto(array_pop($photoPathParts));
$em->flush();
}
Я получаю полный путь к фотографии и обновляю сущность, над которой я сейчас работаю. Это позволяет пройти проверку формы, но если я просто сохраню ее, путь в БД будет обновлен с указанием полного пути к фотографии. Это не то, что я хочу, поэтому я сбрасываю фотографию в файл с относительным путем.
/**
* @ORM\Column(type="string", nullable=true)
*
* @Assert\File(mimeTypes={ "image/png","image/jpeg" })
*/
private $photo;