2015-12-27 3 views
0

Я новичок в Symfony и OOP.Создать новый экземпляр для каждого загружаемого файла

Пытается создать приложение, в котором пользователи могут загружать файлы своей деятельности. У каждого пользователя будет одно или несколько действий. Каждая активность будет иметь ровно один файл.

Пользователь просто загрузит файлы и для каждого файла я хочу создать новую Activity();

Так я думал, что контроллер должен выглядеть следующим образом:

Подробные файлы можно найти здесь: https://gist.github.com/carambazza/53804469d3021601f1bb

// DashboardController.php 
class DashboardController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
     $activity = new Activity(); 

     $form = $this->createForm(ActivityType::class, $activity); 
     $form->handleRequest($request); 

     // form is valid ... 
    } 

.

// ActivityType.php 
class ActivityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', TextType::class) 
      ->add('description', TextType::class) 
      ->add(
       'activityFile', 
       CollectionType::class, 
       array(
        'entry_type' => ActivityFileType::class, 
        'allow_add' => true, 
        'allow_delete' => true, 
        'by_reference' => false, 
       ) 
      ) 
      ->add('save', SubmitType::class, array('label' => 'Upload .fit file')); 
    } 

.

// ActivityFileType.php 
class ActivityFileType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('file', FileType::class, 
       array(
        "required" => TRUE, 
        "attr" => array(
         //"accept" => "image/*", 
         "multiple" => true, 
        ) 
       ) 
      ); 
    } 

отображение, как это:

// Activity.orm.xml 
<?xml version="1.0" encoding="utf-8"?> 
<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 repository-class="ChartsBundle\Repository\ActivityRepository" name="ChartsBundle\Entity\Activity"> 

    <id name="id" type="guid" column="id"> 
     <generator strategy="UUID"/> 
    </id> 

    <many-to-one field="user" target-entity="User" inversed-by="activities"> 
     <join-column name="user_id" referenced-column-name="id" /> 
    </many-to-one> 

    <one-to-one field="activityFile" target-entity="ActivityFile"> 
     <join-column name="activity_file_id" referenced-column-name="id" /> 
    </one-to-one> 

    <!-- other connnections --> 

    <!-- all fields --> 

    </entity> 
</doctrine-mapping> 

.

//ActivityFile.orm.xml 
<?xml version="1.0" encoding="utf-8"?> 
<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 repository-class="ChartsBundle\Repository\ActivityFile" name="ChartsBundle\Entity\ActivityFile"> 

    <id name="id" type="guid" column="id"> 
     <generator strategy="UUID"/> 
    </id> 

    <!-- all fields --> 

    </entity> 
</doctrine-mapping> 

Вопрос (ы):

  • ли отношения между объектами Allright нравится то, что они есть?
  • Как я могу загрузить загрузку файла и создать новый экземпляр активности для каждого файла? Пользователи смогут выбрать несколько файлов для загрузки

ответ

1

Форма не подходит для меня. Тип коллекции предназначен для отношений «один ко многим», например, если вы хотите добавить действия к своему пользователю в процессе редактирования, в то время как вы редактируете пользователя. Для связи один-к-одному, вы хотите, чтобы встроить форму для файла деятельности в виде деятельности, поэтому вместо типа коллекции, вам просто нужно это:

->add('activityFile', ActivityFileType::class) 

Ваши отношения выглядят правильно. Предположим, что ваше имя хранилища для вашего объекта ActivityFile несовместимо, вместо этого должно быть ChartsBundle\Repository\ActivityFileRepository, но это небольшая жалоба.

+0

Спасибо, что сейчас работает! Также имя файла хранилища теперь исправлено. Я думаю, что в файле ActivityFile.orm.xml, как вы сказали. Должен ли я изменить свойство 'activityFile' на' activityFiles' для Entity Activity? И изменить его на массив() или что-то, чтобы получить несколько выбранных файлов? – caramba

+0

Как сейчас, если я выберу несколько файлов и отправлю форму, я просто получу последний из выбранных файлов, если я вызову '$ activity-> getActivityFile()', но я бы хотел создать запись активности и загрузить каждый выбранный файл – caramba

+0

@caramba, поскольку это один к одному, я оставил бы это как активность. Если вы хотите иметь несколько файлов для каждого действия, вам нужно будет изменить отношение к одному-ко-многим, и в этот момент ваш первоначальный тип коллекции будет правильным. Зависит от того, что вы хотите, по одному файлу за активность или по нескольким файлам. –

Смежные вопросы