![](/img/trans.png)
[英]Symfony2 Catchable Fatal Error: Argument 1 passed to entity Catchable Fatal Error: Argument 1 passed to entity
[英]Upload file in Symfony2: Catchable Fatal Error: Argument 1 passed to
我使用Symfony2和wamp服務器 。 我嘗試根據Symfony doc / cookbook實施上載方法 。
II有兩個實體 : DocumentsEnsemble.php
和Ensembles.php
。 DocumentsEnsembles是我存儲 1個整體的上傳文件 (圖像,doc,pdf等...)的實體。 一個Ensemble可以有0個或多個文檔,並且一個文檔可以屬於0個或1個單個 Ensemble。
這是我的名為Ensembles.php
Ensembles實體代碼:
namespace MySpace\DatabaseBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Ensembles
*
* @ORM\Table(name="ensembles")
* @ORM\Entity
*/
class Ensembles
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=150, nullable=false)
*/
private $nom;
/**
* @ORM\ManyToOne(targetEntity="Documentsensemble", inversedBy="file")
* @ORM\JoinColumn(name="documentsensemble_id", referencedColumnName="id", nullable=true)
*/
private $documentsensemble;
//the getters and setters
//implement Upload method
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);
}
}
我想實現上載方法,就像您在Ensembles中看到的那樣。 這是名為DocumentsEnsembles.php
的DocumentsEnsemble實體:
namespace MySpace\DatabaseBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Documentsensemble
*
* @ORM\Table(name="documentsensemble")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Documentsensemble
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
public $nom;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
public $path; //La propriété path stocke le chemin relatif du fichier et est persistée dans la base de données
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()
{
return __DIR__.'src/MySpace/WelcomeBundle/Ressources/public/image/uploadEnsembles'.$this->getUploadDir();
}
protected function getUploadDir()
{
return 'uploads/documents';
}
/**
* @Assert\File(maxSize="4M")
* @ORM\OneToMany(targetEntity="Ensembles", mappedBy="documentsensemble")
*/
public $file;
// the getters and setters
在帶有post方法的表單中,我可以在我的Ensembles實體中添加一個整體。 這個表格包含了輸入文件,上傳文件屬於一個整體。 我使用由Doctrine生成的名為EnsemblesType.php
的表單,這是以下代碼:
namespace MySpace\DatabaseBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class EnsemblesType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('referenceclient')
->add('nom')
->add('voie')
->add('numerovoie')
->add('codepostal')
->add('commune')
->add('dateactivation','date', array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'attr' => array('class' => 'datepicker')
))
->add('datedesactivation', 'date', array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'attr' => array('class' => 'datepicker')
))
->add('documentsensemble', 'file')
->add('parcsimmobilier')
->add('systemes')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MySpace\DatabaseBundle\Entity\Ensembles'
));
}
/**
* @return string
*/
public function getName()
{
return 'MySpace_databasebundle_ensembles';
}
}
這是我的addEnsembles.html.twig
,帶有post方法的形式:
<form action="{{ path('ajouterEnsembles_process') }}" method="post" {{ form_enctype(formEnsemble) }}>
{{ form_errors(formEnsemble) }}
<div>
{{ form_label(formEnsemble.nom, "Nom de l'ensemble:", {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(formEnsemble.nom) }}
<div>
{{ form_widget(formEnsemble.nom, {'attr': {'class': 'form-control'}}) }}
</div>
</div>
<br>
{# Upload #}
<div class="container">
<div class="row col-md-12">
<div class="row col-md-9">
{{ form_label(formEnsemble.documentsensemble, "Transférer un fichier appartenant à cet ensemble:", {'label_attr': {'class': 'control-label'}}) }}
<div>
{{ form_widget(formEnsemble.documentsensemble) }}
</div>
</div>
<br>
{# validation #}
<div class="row col-md-3">
<input type="submit" value="Ajouter" class="btn btn-success"/>
</div>
</div>
</div>
</form>
提交表單時,出現以下錯誤:
可捕獲的致命錯誤:傳遞給MySpace \\ DatabaseBundle \\ Entity \\ Ensembles :: setDocumentsensemble()的參數1必須是MySpace \\ DatabaseBundle \\ Entity \\ Documentsensemble的實例,Symfony \\ Component \\ HttpFoundation \\ File \\ UploadedFile的實例,在C中調用: \\ wamp \\ www \\ BitbucketRepository \\ repos \\ SymfonyGirusMySpace \\ vendor \\ symfony \\ symfony \\ src \\ Symfony \\ Component \\ PropertyAccess \\ PropertyAccessor.php在438行中定義,並在C:\\ wamp \\ www \\ BitbucketRepository \\ repos \\ SymfonyGirusMySpace \\ s \\ DatabaseBundle \\ Entity \\ Ensembles.php第411行
有人可以向我解釋以找到正確的解決方案嗎? 我對上傳文件方法是否正確?
這是我的控制器方法,用於添加帶有上載文件的合奏:
public function addEnsemblesAction() {
$em=$this->getDoctrine()->getManager();
$ensemble = new Ensembles;
$formEnsemble=$this->createForm(new EnsemblesType(), $ensemble);
$request = $this->getRequest();
if ($request->isMethod('POST') | ($formEnsemble->isValid())) {
$formEnsemble->bind($request);
$ensemble = $formEnsemble->getData();
$em->persist($ensemble);
$em->flush();
return $this->redirect($this->generateUrl('showEnsembles'));
}
else {
return $this->render('MySpaceGestionPatrimoinesBundle:Ensembles:addrEnsembles.html.twig', array('formEnsemble' => $formEnsemble->createView() ));
}
}
解決方案的更新問題
實際上,我更改了兩個實體之間的關系。 實際上,上傳方法必須在Documentsensemble.php中。
這是Ensembles.php
的代碼:
namespace MySpace\DatabaseBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Ensembles
*
* @ORM\Table(name="ensembles")
* @ORM\Entity
*/
class Ensembles
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=150, nullable=false)
*/
private $nom;
// The getters and setters
現在使用上載方法(回調等...)的Documentsensembles.php
代碼:
namespace MySpace\DatabaseBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Documentsensemble
*
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name="documentsensemble", indexes={@ORM\Index(name="IDX_674FC05E5BA556D3", columns={"ensembles_id"})})
* @ORM\Entity
*/
class Documentsensemble
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=255, nullable=false)
* @Assert\NotBlank
*/
private $nom;
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255, nullable=true)
*/
private $path; //stocke le chemin relatif du fichier et est persistée dans la base de données
/**
* @Assert\File(maxSize="6000000")
*/
public $file;
// UPLOAD
public function getWebPath()
{
return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
}
protected function getUploadRootDir()
{
// le chemin absolu du répertoire où les documents uploadés doivent être sauvegardés
return __DIR__.'/../../../../MySpace/'.$this->getUploadDir();
}
protected function getUploadDir()
{
// on se débarrasse de « __DIR__ » afin de ne pas avoir de problème lorsqu'on affiche le document/image dans la vue.
return 'uploads/documentsEnsemble';
}
// propriété utilisé temporairement pour la suppression
private $filenameForRemove;
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
$this->path = $this->file->guessExtension();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
// lancer une exception ici si le fichier ne peut pas être déplacé afin que l'entité ne soit pas persistée dans la base de données comme le fait la méthode move() de UploadedFile
$this->file->move($this->getUploadRootDir(), $this->nom.'.'.$this->file->guessExtension());
unset($this->file);
}
/**
* @ORM\PreRemove()
*/
public function storeFilenameForRemove()
{
$this->filenameForRemove = $this->getAbsolutePath();
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if ($this->filenameForRemove) {
unlink($this->filenameForRemove);
}
}
public function getAbsolutePath()
{
return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->nom.'.'.$this->path = $this->file->guessExtension();
}
// The getters and the setters
現在是控制器的代碼:
public function uploadAction() {
$message = "Infos: aucun documents uploadé présent pour le moment";
$em=$this->getDoctrine()->getManager();
$documentsensemble = $em->getRepository('MySpaceDatabaseBundle:Documentsensemble');
$documentsensemble = new Documentsensemble();
$formUpload = $this->createForm(new DocumentsensembleType(), $documentsensemble);
$requestUpload = $this->getRequest();
//instruction if à plusieurs conditions: ici si la method est POST et si le formulaire est valide
if ($requestUpload->isMethod('POST') | ($formUpload->isValid())) {
$formUpload->bind($requestUpload);
$documentsensemble = $formUpload->getData();
//$documentsensemble->upload();
//Cette ligtne est commenté car nous utilisons les callbacks pour la méthode Upload de Symfony
$em->persist($documentsensemble);
$em->flush();
return $this->redirect($this->generateUrl('MySpace_formulaire_recherche_ensembles'));
}
//retourner le formulaire d'ajout si c'est invalide
else {
return $this->render('MySpaceGestionPatrimoinesBundle:Ensembles:documentsensemble.html.twig', array('formUpload' => $formUpload->createView(), 'message' => $message ));
}
}
最后,我用另一種形式用細枝稱呼該表格,有很多方法和方法,請查看symfony食譜或此處 ,例如Abdallah Arffak建議我。
非常感謝您,如果我的英語不好,抱歉。
你應該用這個
{{ form_label(formEnsemble.file, "Transférer un fichier appartenant à cet ensemble:", {'label_attr': {'class': 'control-label'}}) }}
<div>
{{ form_widget(formEnsemble.file) }}
</div>
</div>
代替這個
{{ form_label(formEnsemble.documentsensemble, "Transférer un fichier appartenant à cet ensemble:", {'label_attr': {'class': 'control-label'}}) }}
<div>
{{ form_widget(formEnsemble.documentsensemble) }}
</div>
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.