VichUploaderBundleでハマるポイント

VichUploaderBundleでハマるポイント

May 10, 2017,
tags: php symfony


このエントリーをはてなブックマークに追加

最近VichUploderBundleでハマるポイントがいくつかあるのでメモしておく。

Uploadableの設定忘れ

これ本当によくやってしまう。。。 ちゃんと@Vich\ Uploadableを書かないとだめ。。

namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @ORM\Entity
 * @Vich\Uploadable
 */
class Product
{
	...

enctypeの設定忘れ

Twigでform_start使えばいいんだろうけど、formタグを書かなければ行けないときによくenctype="multipart/form-data"の指定を忘れてアップロードされない。。

がんばろう・・・。

Entityに変換がない場合

画像の変更とかするときに良く発生するんだけど、Entityに何かしらの変更がない場合はEntityManger::flash()とかしても更新されない・・・。 画像のみ変更する場合なんかは同時にupdatedAtみたいな項目のカラムを明示的にEntityManger::flash()まえに更新する必要がある。

詳しくはVichUploaderBundleのドキュメントを読んでほしい。 VichUploaderBundle/known_issues.md at master · dustin10/VichUploaderBundle · GitHub

僕なりの解決策

FormTypeのaddModelTransformerを使ってformのなかでupdatedAt的な更新日のプロパティを更新してあげるようにしている。

class EditUploadType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('imageFile', FileType::class,[
            'label' => '画像',
            'required' => true,
        ]);
        $builder->addModelTransformer(new CallbackTransformer(function($data){
            return $data;
        }, function(Banner $data){
            $data->updatedAt = new \DateTime();
        }));
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Banner::class,
        ]);
    }

}

最後に

  • たまに使うと忘れていることが多いVichUploaderBundleですが、非常に便利なのでこれからも積極的に活用しようと思います。
comments powered by Disqus