Прежде всего, я не знал, как правильно описать то, что я хочу, поэтому вопрос может быть не таким точным
Я использую фреймворк Symfony с доктриной.
Моя главная цель состояла в том, чтобы создать одну таблицу со столбцом дискриминатора и запускать EventListener всякий раз, когда должен быть отправлен загружаемый файл.
abstract class UploadFile {}
И три класса, которые расширяют его
class FanUploadFile extends UploadFile {}
class SupporterUploadFile extends UploadFile {}
class ProductionUploadFile extends UploadFile {}
Мой EventListener
class UploadFileListener
{
private $uploadDirs;
private $targetDir;public function __construct(array $uploadDirs)
{
$this->uploadDirs = $uploadDirs;
$this->targetDir = $uploadDirs['product_file'];
}
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ((!$entity instanceof Production) &&
(!$entity instanceof Fan) &&
(!$entity instanceof Supporter)) {return;}
// loop over the uploaded files
foreach ($entity->getUploadedFiles() as $uploadedFile) {
// check if the file is to be uploaded
if (!$uploadedFile instanceof UploadedFile)
continue;
$fileName = md5(uniqid()) . '.' .$uploadedFile->guessExtension();
// case to instantiate new object for each case
switch ($entity) {
case $entity instanceof Production:
$pf = new ProductionUploadFile();
break;
case $entity instanceof Fan:
$pf = new FanUploadFile();
break;
case $entity instanceof Supporter:
$pf = new SupportUploadFile();
break;
}$pf->setPath($fileName)
->setMimeType($uploadedFile->getMimeType())
->setClientName($uploadedFile->getClientOriginalName());
$entity->addFile($pf);
$uploadedFile->move($this->targetDir, $fileName);
}
}
}
Кроме того, мое отображение (с использованием orm.xml)
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="AppBundle\Entity\UploadFile" inheritance-type="SINGLE_TABLE">
<discriminator-column name="discr" length="20" />
<discriminator-map>
<discriminator-mapping value="fan" class="FanUploadFile" />
<discriminator-mapping value="support" class="SupportUploadFile" />
<discriminator-mapping value="production" class="ProductionUploadFile" />
</discriminator-map>
<id name="id" type="integer">
<generator strategy="AUTO" />
</id>
<field name="path" length="40" />
<field name="mimeType" />
<field name="clientName" />
</entity>
И для других классов
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="AppBundle\Entity\SupportUploadFile**" />
</doctrine-mapping>
** То же самое для всех классов, меняющих сущность
Текущая ошибка: Call to a member function setMimeType() on null
UploadFile
а остальные классы пусты.Если я удаляю реферат из UploadFile I
Entity 'AppBundle\Entity\UploadFile' has to be part of the discriminator map of 'AppBundle\Entity\UploadFile' to be properly mapped in the inheritance hierarchy.
Но я не знаю, как отобразить UploadFiles
с другими лицами Production,Fan,Support
,
В основном у меня есть форма foreach таблица (Production,Fan,Support)
Три сущности (FanUploadFile,ProductionUploadFile,SupportUploadFile)
Mappedby: UploadFile
Поэтому, когда пользователь отправляет форму etc Production
Я хочу, чтобы файл был сохранен в UploadFile
через сопоставление дискриминатора ProductionUploadFile с discr Production
Но я не могу понять, как сделать связь между
производство <-> Загрузить файл <-> ProductionUploadFile
.
Задача ещё не решена.
Других решений пока нет …