Catchable Fatal Error: Аргумент 1 передан? Symfony2.1

Я остановлен этой ошибкой:

Исправляемая фатальная ошибка: аргумент 1 передан
Joker \ CoreBundle \ Entity \ Incidentfile :: setFile () должен быть экземпляром
Symfony \ Component \ HttpFoundation \ File \ UploadedFile, заданная строка,
называется в
/Applications/MAMP/htdocs/joker-repo/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php
по строке 538 и определяется в
/Applications/MAMP/htdocs/joker-repo/src/Joker/CoreBundle/Entity/Incidentfile.php
линия 157

В моей сущности у меня есть сеттеры и геттеры для File. Я использовал этот метод для загрузки файла: ЭТОТ

И была проблема с разрешением для папки upload_images, но после того, как я решил, все работало нормально, но теперь что-то пошло не так.

Вот сущность

/**
* Incidentfile
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Joker\CoreBundle\Entity\IncidentfileRepository")
* @ORM\HasLifecycleCallbacks
*/
class Incidentfile
{
//
//    /**
//     * @ORM\ManyToOne(targetEntity="Incidentlist", inversedBy="ListFiles")
//     * @ORM\JoinColumn(name="IncidentListId", referencedColumnName="id")
//     */
//    protected $FileList;

/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var \DateTime
*
* @ORM\Column(name="createdat", type="datetime")
*/
private $createdat;

/**
* Image path
*
* @var string
*
* @ORM\Column(type="text", length=255, nullable=false)
*/
protected $path;

/**
* Image file
*
* @var File
*
* @Assert\File(
*     maxSize = "5M",
*     mimeTypes = {"image/jpeg", "image/gif", "image/png", "image/tiff"},
*     maxSizeMessage = "The maxmimum allowed file size is 5MB.",
*     mimeTypesMessage = "Only the filetypes image are allowed."* )
*/
protected $file;

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

/**
* Set createdat
*
* @param \DateTime $createdat
* @return Incidentfile
*/
public function setCreatedat($createdat)
{
$this->createdat = $createdat;

return $this;
}

/**
* Get createdat
*
* @return \DateTime
*/
public function getCreatedat()
{
return $this->createdat;
}

/**
* Called before saving the entity
*
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
// do whatever you want to generate a unique name
$filename = sha1(uniqid(mt_rand(), true));
$this->path = $filename.'.'.$this->file->guessExtension();
}
}

/**
* Called before entity removal
*
* @ORM\PreRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}

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

/**
* Called after entity persistence
*
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/

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 up
// when displaying uploaded doc/image in the view.
return 'uploaded_images';
}

/**
* Sets file.
*
* @param UploadedFile $file
*/
public function setFile(UploadedFile $file = null)
{    if (null === $file) {
return;
}
$this->file = $file;

if(in_array($file->getMimeType(),array("image/jpeg", "image/gif", "image/png", "image/tiff"))){
$filename=rand(100000,1000000).'_'.$file->getClientOriginalName();
$file->move($this->getUploadRootDir(),$filename
);

$this->path =$filename;
$this->file = null;
}
else $this->path=null;
}

/**
* Get file.
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}
public function upload() {
// the file property can be empty if the field is not required
if (null === $this->getFile()) {
return;
}
$file=$this->getFile();
$filename=rand(100000,1000000).'_'.$file->getClientOriginalName();
// we use the original file name here but you should
// sanitize it at least to avoid any security issues
// move takes the target directory and target filename as params
$file->move($this->getUploadRootDir(),$filename
);

// set the path property to the filename where you've saved the file
$this->path =$filename;

// clean up the file property as you won't need it anymore
$this->setFile(null);
}

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

return $this;
}

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

/**
* Set FileList
*
* @param \Joker\CoreBundle\Entity\Incidentlist $fileList
* @return Incidentfile
*/
public function setFileList(\Joker\CoreBundle\Entity\Incidentlist $fileList = null)
{
$this->FileList = $fileList;

return $this;
}

/**
* Get FileList
*
* @return \Joker\CoreBundle\Entity\Incidentlist
*/
public function getFileList()
{
return $this->FileList;
}}

А вот и мой контроллер:

public function TestAction(Request $request){
$incfileRepo = new Incidentfile();
$formfile = $this->createForm(new IncfileType(), $incfileRepo);if ($request->isMethod('POST')) {
$formfile->bind($request);

if ($formfile->isValid()) {$em = $this->getDoctrine()->getManager();

$em->persist($incfileRepo);
$em->flush();

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

$spotEntity = $this->getCurrentSpot();
$sentryEntity = $this->getCurrentSentry();
$messagesCollection = $this->getDoctrine()->getRepository('JokerCoreBundle:Message')->findBy(array(
'spot'  =>  $spotEntity,
'sentry'    =>  $sentryEntity
), array(
'sent_date' =>  'DESC'
));

return $this->render('JokerAdminBundle:incidents:addfullform.html.twig', $this->getViewConstants(array(
'formfile'=>$formfile->createView(),
'spot'  =>  $spotEntity,
'sentry'    =>  $sentryEntity,
'messagesCollection'    =>  $messagesCollection,
)));}

Форма в веточке:

 <form action="" method="post">
{{ form_rest(formfile) }}

<div class="singleTableForm">
<input style="float: left; margin-left: 338px; " type="submit" name="" class="button" value="Add" />
</div>
</form>

1

Решение

Я выяснил, что было не так .. У прута была проблема

<form action="" method="post" {{ form_enctype(formfile) }}>

Просто добавь **{{ form_enctype(formfile) }}**

1

Другие решения

Вы должны добавить аннотацию

/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()

узнать больше http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html

И покажи код формы

UPD: лучший способ — использовать теги {{ form_start(form) }} а также {{ form_end(form) }} это также защитит вас от атак CSR

0