如何使用表单中的现有数据填充ArrayCollection变量?

时间:2013-05-10 09:30:27

标签: symfony one-to-many entities

我对Symfony有点新意,我有一个问题。 我目前正在制作一个Gallery Bundle(由'Gallery'和'Image'实体组成),这就是我的问题。

我可以上传图片以及使用与文件对应的实体图片,但之后我想将图片分类到图库中。我在我的图库和图像实体之间建立了一对多的关系,使用了一个应该代表图像的ArrayCollection $ images(进入图库实体)。

现在,我如何从浏览器填充$ images变量? 我想到了这个解决方案:将一个文本字段添加到Gallery实体中,使用图像名称,在保持Gallery实体之前,我会获取相应的Images实体并将它们放入我的变量$ images中,但问题是我可以从实体访问实体管理器..

感谢您的帮助,如果您需要代码我当然可以告诉您,即使它非常基本。

编辑:我找到了一种从实体访问实体管理器的方法,但据说它是不安全的。暂时我可能会使用它,但如果有人可以向我解释一个更好的方法,我会接受它。

2 个答案:

答案 0 :(得分:0)

您可以write a service向实体管理器注入,该实体管理器可以从$ image名称数组创建& /或更新库,让您的控制器调用而不是让您的实体依赖于实体管理器。例如:(请参阅上面的链接,了解如何在services.yml中配置服务)

class GalleryManager
{
    private $entityManager;

    public function __construct(\Doctrine\ORM\EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function updateGalleryImages(Gallery $gallery, array $imageNames)
    {
        ...
    }
}

但是,我不确定输入图像名称是否是最佳方法。您如何确保您的图像名称是唯一的?处理未找到的名称?处理重复的名字?界面的可用性是否重要?如何提高效率 - 每个图像名称一个查询?画廊可能包含多少?

另一种用户界面是提供某种图像搜索/列表,并允许用户从结果中选择要添加到图库的图像 - 在这种情况下,选择应该作为图像实体的数组返回,如果实现的话正确。最简单的是,对于少量图像,这可能只是所有图像名称的多选列表框,尽管理想情况下用户希望看到他们选择的图像的缩略图预览。

所有图像名称(或复选框集)的基本列表框可以使用表单(data_class Gallery)和entity field来实现图像集合。这将直接映射到gallery->图像,实体永远不需要依赖EntityManager。

从过滤后的图像集中进行选择会更复杂,但如果您感兴趣,我可以指出正确的方向。

答案 1 :(得分:0)

我不知道我是否遗漏了一些重要的东西迫使你手动填充你的$ images,但是要从浏览器填充多个图片库并坚持下去,我会按照下面的步骤操作:

  1. 使用实体中的表单构建器创建映射表单。
  2. 使用控制器操作保持(您应该有您的学说映射)
  3. 使用doctrine eventos:preUpdate,prePersist,PostPersist等。正确上传图像文件。
  4. 正如你所看到的,烹饪书是一个很好的参考开始;它将指导您完成Web开发中最常见的任务。