为每个上传的文件创建新实例

Posted

技术标签:

【中文标题】为每个上传的文件创建新实例【英文标题】:Create new instance for every uploaded file 【发布时间】:2015-12-27 14:09:50 【问题描述】:

我是 Symfony 和 OOP 的新手。

尝试创建一个应用程序,用户可以在其中上传他们的活动文件。每个用户都会有一个或多个活动。每个 Activity 将只有一个文件。

用户将只上传文件,并且我要为每个文件创建一个新的 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>

问题:

Object 之间的关系是否和它们原来的一样? 如何让文件上传工作并为每个文件创建一个新的活动实例?用户将能够选择多个文件进行上传

【问题讨论】:

【参考方案1】:

表格不对,对我来说。集合类型用于一对多关系,例如,如果您想在编辑用户的同时将活动添加到用户内联。对于一对一的关系,您希望将活动文件的表单嵌入到活动表单中,因此您只需要这个而不是集合类型:

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

你的关系看起来不错。建议您的 ActivityFile 实体的存储库文件名不一致,应改为 ChartsBundle\Repository\ActivityFileRepository,但这是一个小问题。

【讨论】:

感谢表单现在可以使用!此外,我认为存储库文件名现在已修复,如您所建议的那样在 ActivityFile.orm.xml 中。我应该将实体活动的属性activityFile 更改为activityFiles 吗?并将其更改为 array() 或其他东西以获取多个选定的文件? 就像现在,如果我选择几个文件并提交表单,如果我调用 $activity-&gt;getActivityFile(),我只会从所选文件中获取最后一个,但我想创建一个活动条目并上传每个选定的文件 @caramba 因为它是一对一的,所以我将其保留为 activityFile。如果您希望每个活动有多个文件,则需要将关系更改为一对多,此时您的原始集合类型将再次正确。取决于你想要什么,每个活动一个文件,或多个文件。 我想要每个活动一个文件。但我想这样做,以便用户可以选择多个文件,如果他这样做:假设用户选择 5 个文件,现在我需要创建 5 个活动(5x new Activity())并且每个活动都包含一个文件.. 但我只是不知道我怎么能做到这一点!? 嗯。根据我的经验,没有 Symfony 表单类型可以处理多个同时上传。我做类似事情的方式(具有多个图像实体的画廊实体,每个图像实体都附加一个文件)是在我的前端 Twig 模板中使用 Dropzone.js,该模板将文件发布到后端操作,该操作在收到时创建新实体它们处理存储,然后将这些实体链接到父级。真的很容易设置,在这个用例中可能是你最好的解决方案。如果有帮助,可以向您展示一些示例代码。

以上是关于为每个上传的文件创建新实例的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历 csv 文件以创建连接的数据帧。需要在文件名中使用日期为每个文件创建新列

为收到的每个广播创建一个新的 MyAppWidgetProvider 实例?

通过Google Drive REST API上传或创建包含内容的新文件?

12C新特性 -- 共享asm口令文件

创建新实例时如何保护来自 Amazon EC2 实例的数据?

创建文件追加文件