Sonata Admin是Symfony最重要的bundle之一。它可以基于ORM快速生成CRUD增删改查,并且实现某些定制。定制的可能性随着开发者对Admin Bundle的Hack程度而有所不同。

但是理论上几乎所有内容都可以定制。理由很简单,Sonata Admin Bundle经过长达五年以上的开发,现在已经非常完善,空前强大,覆盖全部Entity映射关系。

而且对于表单本身,也可以直接兼容Symfony框架的原生表单字段类型。具体表现为:Javascript的兼容性完美;映射关系明确,无论加图还是减图,表单提交之后,数据库中与文章相关的图片表,也会有相应的增减。

今举一小例如下:

上图表明,Sonata直接兼容Symfony原生的collection字段类型。图片与新闻之间的关系是,one-to-many(一文对多图)。

要实现这种效果,需要做很多手脚,包括手写全新字段类型,比如上图的ImageType。当然为了实现模板层的定制,还需要写表单类型扩展。

这时需要hack一下Sonata Admin固有的表单系统,以实现对指定内容的覆写。

这对于快速开发有意义,我们不需要做一个包含了高级JS效果的“多文件带进度条的Ajax上传”表单系统——虽然这也可以在Sonata Admin中定制完成——但对于商城类程序来讲,每个产品都要有些图片,直接在产品表单中完成处理,毕竟比较方便。而且Symfony的表单系统最大的特点就是随时随地的复用,没有任何障碍。

唯一的缺点就是图太大时,提交表单时要傻等一小会儿。

不知道Symfony在讲解Doctrine Upload时推荐的 VichUploaderBundle 怎么样?因为我们在整个开发过程中都是使用自己的图片处理程序,甚至开发了一个图片上传的bundle,因此包括专门处理图片的 LiipImagineBundle 也并未用过。

图片上传的最高境界应该是达到Gmail添加附件的那种效果,仅靠后端的原始表单,显然无法实现。