Symfony2のファイルアップロード後にSESSIONに入れるには?

558 views
Skip to first unread message

takashi tabata

unread,
Jul 31, 2013, 2:35:25 AM7/31/13
to symfony-...@googlegroups.com
初めまして。田端と申します。

Symfony2を使って開発をしているのですが、1.4と違い難航しています。

Symfony2でのアップロードはEntityで処理する流れかと思いますが
特殊(?)な画面遷移をしておりsubmitされたデータを一旦SESSIONに保存しております。

流れとしては

inputAction (入力画面)
↓ (データ送信)
completeAction (確認処理)
↓ (エラー時はリダイレクト)
inputAction

この様な流れになります。
この流れになっているのはリロード対策を行いたいからです。

普通のtextはsessionに保存できるのですが
$request->files->get('example')
にするとObjectが入っているので保存できないとエラーが表示されます。

聞きたい事は
1.$request->filesに変わるsessionに保存できる取り方はありますか?
2.sessionから取り出して$formに入れるにはどうしたらいいですか?(validatorを通したいため)


アドバイスや参考になるサイトをお教えいただけると助かります。
宜しくお願い致します!


長くなりますが、Controllerのソースをはっておきます。


<?php

namespace example\FrontBundle\Controller;

use example\FrontBundle\Entity\CompanyUser;
use example\FrontBundle\Form\Type\CompanyUserType;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;

class CompanyUserController extends Controller
{

    private function preController()
    {
        $this->session = $this->getRequest()->getSession();

        $companyUser = new CompanyUser();
        $companyUser->setCompany($this->getUser()->getCompany());

        $this->form = $this->createForm(new CompanyUserType(), $companyUser);
    }

    /**
     * 登録初期
     *
     * @Route("/companyUser/regist/{id}", name="companyUser_regist")
     * @Template()
     */
    public function registAction($id = null)
    {
        $this->preController();

        $this->session->remove($this->form->getName());

        return $this->redirect($this->generateUrl('companyUser_input'));
    }

    /**
     * 入力画面
     *
     * @Route("/companyUser/input", name="companyUser_input")
     * @Template()
     */
    public function inputAction()
    {
        $this->preController();

        if ($this->session->has($this->form->getName())) {
            $this->form->submit($this->session->get($this->form->getName()));
        }

        return ['form' => $this->form->createView()];
    }

    /**
     * エラーチェック、登録処理
     *
     * @Route("/companyUser/complete", name="companyUser_complete")
     * @Template()
     */
    public function completeAction(Request $request)
    {
        if (!$request->isMethod('post')) {
          return $this->redirect($this->generateUrl('companyUser_regist'));
        }

        $this->preController();

        $this->form->submit($request->get($this->form->getName()));

        if (!$this->form->isValid()) {
            $this->session->set($this->form->getName(), $request->get($this->form->getName()));

            return $this->redirect($this->generateUrl('companyUser_input'));
        }

        if ($this->session->has($this->form->getName())) {
            $this->session->remove($this->form->getName());
        }

        $em = $this->getDoctrine()->getManager();
        $em->persist($this->form->getData());
        $em->flush();

        return $this->redirect($this->generateUrl('companyUser'));
    }
}

brtriver(Masao Maeda)

unread,
Aug 7, 2013, 11:24:52 AM8/7/13
to symfony-...@googlegroups.com
こんにちは。前田です。(だいぶ間が空いてしまいましたが...)

ちょうどファイルアップロード機能をSymfony2で実装したのでそのときのパターンが参考になれば。。

1.$request->filesに変わるsessionに保存できる取り方はありますか?

確認画面を用意しているのですが、確認画面にPOSTされた時点で画像をサーバーに一時的に保存し、その名前(ユニーク)をhiddenで持ち回してます。
完了画面へ遷移した場合はこの一時的に保存しているファイルを正規のディレクトリにmvしてます。
(実際のストレージはawsのS3ですが)

セッションを使っていない理由は複数のタブで同じ画面で平行で処理されても問題がないようにするするためです。

2.sessionから取り出して$formに入れるにはどうしたらいいですか?(validatorを通したいため)

1のパターンで説明したように、セッションではなくhiddenでファイル名を持ち回しています。
なので、確認画面と完了画面ではvalidation内容が異なります。

完了画面でのバリデーターでは、すでにファイルそのものはアップロードされている前提なので、
一時ディレクトリにファイルがあるかどうかのチェックだったりします。

実際はファイルを選択した時点でajaxでサーバー側にアップロードしていたり複数画像をアップロードできるようにしていたりと、
さらに複雑だったりしますが基本は上記のような方針でうまくいってます。

レスポンスが遅くなりましたが参考になれば。


2013年7月31日水曜日 15時35分25秒 UTC+9 takashi tabata:
Reply all
Reply to author
Forward
0 new messages