Как получить данные из отображенной дискриминатором доктрины

Прежде всего, я не знал, как правильно описать то, что я хочу, поэтому вопрос может быть не таким точным

Я использую фреймворк 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

.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]