我使用Symfony创建了一个应用程序,我正在使用Media Entity来上传文件并将它们与其他实体链接(例如:带有文章的图像)。
如果我想创建一个带有图片的新文章,一切都会完美无缺,但如果以后我想改变这个相同的图片则不行。此外,如果我同时更新另一个字段,例如标题或其他任何字段,我会看到它们都会改变,除了图片。
没有返回任何错误,所以我想这必须与配置相关联,但我找不到任何问题。
我的代码: 忽略原始
grep -rl 'max_value' | xargs sed -i "s/max_value='.*'/max_value='25'/g"
更新实体的控制器(例如文章)
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Media
*
* @ORM\Table("media")
* @ORM\Entity(repositoryClass="AppBundle\Repository\MediaRepository")
* @ORM\HasLifecycleCallbacks
*/
class Media
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\COlumn(name="updated_at",type="datetime", nullable=true)
*/
private $updateAt;
/**
* @ORM\PostLoad()
*/
public function postLoad()
{
$this->updateAt = new \DateTime();
}
/**
* @ORM\Column(type="string",length=255, nullable=true)
*/
public $path;
public $file;
public function getUploadRootDir()
{
return realpath(__dir__.'/../../../web/img/upload');
}
public function getAbsolutePath()
{
return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
}
public function getAssetPath()
{
return 'img/upload/'.$this->path;
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
$this->tempFile = $this->getAbsolutePath();
$this->oldFile = $this->getPath();
$this->updateAt = new \DateTime();
if (null !== $this->file) {
$this->path = sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
$extentions_allowed = array('jpeg', 'png', 'svg', 'gif');
if (null !== $this->file) {
if(in_array($this->file->guessExtension(), $extentions_allowed))
{
$this->file->move($this->getUploadRootDir(), $this->path);
unset($this->file);
if ($this->oldFile != null) unlink($this->tempFile);
}else {
unset($this->file);
throw new \Exception('Seules les images sont autorisées (jpg/png/gif/svg)');
}
}
}
/**
* @ORM\PreRemove()
*/
public function preRemoveUpload()
{
$this->tempFile = $this->getAbsolutePath();
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if(file_exists($this->tempFile)){
unlink($this->tempFile);
}
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function getPath()
{
return $this->path;
}
}
实体的形式
public function blocAction(Request $request, Bloc $bloc = null){
if($bloc){
$form = $this->createForm('AppBundle\Form\BlocType', $bloc, array(
'type' => $bloc->getType()
));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid() ){
try{
$this->getDoctrine()->getManager()->persist($bloc);
$this->getDoctrine()->getManager()->flush();
}catch (\Exception $e){
$this->addFlash(
'error',
$e->getMessage()
);
}
return $this->redirectToRoute('app_admin_bloc', array('id' => $bloc->getId()));
}
return $this->render('admin/bloc.html.twig', array(
'bloc' => $bloc,
'form' => $form->createView()
));
}else{
return $this->redirectToRoute('app_admin_index');
}
}
答案 0 :(得分:0)
首先,你应该清理你的媒体实体,因为它混合了公共属性和私有属性,并且它有太多的逻辑。最佳做法是:
然后,为了使表单触发错误,您需要向实体添加断言注释: 例如:
use Symfony\Component\Validator\Constraints as Assert;
class Media
{
//...
/**
* @ORM\Column(type="string",length=255, nullable=true)
*/
private $path;
/**
* @Assert\NotBlank()
* @Assert\File(
* mimeTypes={"image/jpeg", "image/png", "application/svg+xml", "image/gif"},
* message="Seules les images sont autorisées (jpg/png/gif/svg)"
* )
*/
private $file;
//...
这样你就可以摆脱当前的$extentions_allowed
支票。
请查看有关如何正确上传文件的详细文档:https://symfony.com/doc/current/controller/upload_file.html