0

我试图理解 symfony2 中的嵌入形式。

我有两个实体iconasset它们之间存在多对多关系以及OneToOneon$icon->imageLargeicon->imageThumb

注意:(资产是类名,但$image...在图标内引用)

我最终想要的是一个与图标相关的图像库和图标上的两列,以反映哪个图像是主缩略图和主大图像......

我创建了一个 IconType:

class IconType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options){
    $builder->add('name');
    $builder->add('imageThumb', new AssetType());
    $builder->add('imageLarge', new AssetType());
}

public function getName(){
    return 'icon';
}


public function setDefaultOptions(OptionsResolverInterface $resolver){
    $resolver->setDefaults(array(
        'data_class' => 'SixString\PearBundle\Entity\Icon',
    ));
}
} 

和一个资产类型:

class AssetType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options){
    $builder->add('file');
}

public function getName(){
    return 'asset';
}


public function setDefaultOptions(OptionsResolverInterface $resolver){
    $resolver->setDefaults(array(
            'data_class' => 'SixString\PearBundle\Entity\Asset',
        ));
}
}

我在我的控制器中创建我的表单:

$icon = new Icon;
$form = $this->createForm(new IconType(), $icon);

if($request->isMethod('POST')) {
    $form->bind($request);
    if ($form->isValid()) {
      ....
    }
}
return $this->render('SixStringPearBundle:Icon:form.html.twig', array("form" => $form->createView()));

到目前为止,一切似乎都在交互,我已经在我的模板中创建了我的表单,它显示了图标名称字段以及两个资产文件上传器。

我迷路的地方是如何访问上传的assets. 我需要将这两个持久化assets到数据库,然后设置$icon->addImage($asset1); $icon->addImage($asset2);为多对多,并且$icon->setImageThumb($asset1); $icon->setImageLarge($asset2);

我不确定这一切是否有意义,但任何帮助弄清楚逻辑或简单地如何访问这些资产将不胜感激!

4

1 回答 1

0

您可以按如下方式访问上传的资产:

$imageThumbFile = $form->get('imageThumb')->get('file')->getData();
$imageLargeFile = $form->get('imageLarge')->get('file')->getData();

如果您打算将这些作为 blob 存储在数据库中,那么您可能会发现这个 SO 问题很有帮助:How do I persist Images with Doctrine

或者,您可以将上传的文件存储在文件系统中,并将文件上传集成到您的实体生命周期中,方法是按照说明书条目如何使用 Doctrine 处理文件上传

编辑:

如果使用说明书条目中的生命周期回调方法:

  1. 与示例中的 Document 类似地实现 Asset 类
  2. 修改 Icon 类以从 Icon::setImageThumb() 和 Icon::setImageLarge() 调用 $this->addImage($asset)
  3. 对于 Icon 类,将级联持久性添加到 $images 关系
  4. 来自控制器的调用仅在 $icon 上持续存在,其他一切都应自行处理。
于 2013-06-07T10:49:06.920 回答