0

ファイルアップロードダイアログを追加したい Symfony2 フォームがあります。

Symfony のドキュメント (http://symfony.com/doc/2.0/cookbook/doctrine/file_uploads.html) に従って、Document クラスを作成しました。

<?php

namespace Acme\AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Document
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    public $path;

    /**
     * @Assert\File(maxSize="6000000")
     */
    public $file;


    public function getAbsolutePath()
    {
        return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
    }

    public function getWebPath()
    {
        return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
    }

    protected function getUploadRootDir()
    {
        // the absolute directory path where uploaded documents should be saved
        return __DIR__.'/../../../../web/'.$this->getUploadDir();
    }

    protected function getUploadDir()
    {
        // get rid of the __DIR__ so it doesn't screw when displaying uploaded doc/image in the view.
        return 'uploads/documents';
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpload()
    {
        if (null !== $this->file) {
            $this->path = sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
        }
    }

    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    public function upload()
    {
        if (null === $this->file) {
            return;
        }

        $this->file->move($this->getUploadRootDir(), $this->path);

        unset($this->file);
    }

    /**
     * @ORM\PostRemove()
     */
    public function removeUpload()
    {
        if ($file = $this->getAbsolutePath()) {
            unlink($file);
        }
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set path
     *
     * @param string $path
     */
    public function setPath($path)
    {
        $this->path = $path;
    }

    /**
     * Get path
     *
     * @return string
     */
    public function getPath()
    {
        return $this->path;
    }
}

DocumentType フォーム クラス:

<?php

namespace Acme\AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

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

        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                    'data_class' => 'Acme\AppBundle\Entity\Document',
            ));
        }

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

ただし、これを既存のエンティティとフォーム クラスに追加すると、次のようになります。

<?php

namespace Acme\AppBundle\Entity\Profile;

use Doctrine\ORM\Mapping as ORM;
use Acme\AppBundle\Entity\jDocument;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="UserProfile")
 */
class UserProfile extends GenericProfile
{

    //... Other entity params

    /**
     * @ORM\OneToOne(cascade={"persist", "remove"}, targetEntity="Acme\AppBundle\Entity\Document")
     * @ORM\JoinColumn(name="picture_id", referencedColumnName="id", onDelete="set null")
     */
    protected $picture;

    /**
     * Set picture
     *
     * @param Acme\AppBundle\Entity\Document $picture
     */
   //\Acme\AppBundle\Entity\Document  
    public function setPicture($picture)
    {
        $this->picture = $picture;
    }

    /**
     * Get picture
     *
     * @return Acme\AppBundle\Entity\Document
     */
    public function getPicture()
    {
        return $this->picture;
    }

    //... Other entity getters and setters

}

フォームを送信するたびに、次のエラーが表示されます。

ErrorException: Warning: ini_set(): A session is active. You cannot change the session module's ini settings at this time in /var/www/wolseley-integrated-services/builds/dev/app/cache/prod/classes.php line 421

しかし、ページのタイトルは「Entity was not found. (500 Internal Server Error)」です。

見つからないエンティティを特定できる人はいますか? それとも、それが問題なのですか?

私はいくつかのグーグルを行い、php.ini で session.auto_start が 0 に設定されていることを確認しました。すべてのセッションとキャッシュをクリアしました...困惑しています!

4

1 に答える 1

0

私のnginx構成のエラーページ定義が原因で、この奇妙なセッションエラーメッセージが表示されていたことがわかりました。

エンティティが見つからないという問題は、エンティティのいくつかのエラーを修正することで解決されました。Symfony 開発者バーは、問題を追跡するのに十分な情報を提供してくれました。

于 2013-01-03T22:44:49.600 に答える