gpt4 book ai didi

php - 使用 liipImagineBundle 更新/删除记录时删除/更新缓存图像

转载 作者:可可西里 更新时间:2023-11-01 12:29:46 24 4
gpt4 key购买 nike

我是 symfony2 的新手。我正在使用 liipImagineBundle 来管理图像缩略图。我有一个使用生命周期回调来管理产品图像的产品实体类。

产品.php

<?php

namespace Svipl\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as GEDMO;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
* Svipl\AdminBundle\Entity\Product
* @ORM\Entity
* @ORM\Table(name="product")
* @ORM\Entity(repositoryClass="Svipl\AdminBundle\Entity\ProductRepository")
* @ORM\HasLifecycleCallbacks
*/
class Product{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(type="string", length=25, unique=true)
*/
private $name;

/**
* @ORM\Column(type="text")
*/
private $description;

/**
* @ORM\Column(type="float", length=8)
* @var unknown
*/
private $price;

/**
* @GEDMO\Timestampable(on="update")
* @ORM\Column(name="updated_at", type="datetime")
*/
private $updated_at;

/**
* @GEDMO\Timestampable(on="create")
* @ORM\Column(name="created_at", type="datetime")
*/
private $created_at;

/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
protected $category;

/**
* @ORM\Column(name="image", type="string", length=50)
*/
private $image;

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

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

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 'uploads/product';
}

private $file;

/**
* Get file.
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}

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

/**
* Set name
*
* @param string $name
* @return Product
*/
public function setName($name)
{
$this->name = $name;

return $this;
}

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

/**
* Set description
*
* @param string $description
* @return Product
*/
public function setDescription($description)
{
$this->description = $description;

return $this;
}

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

/**
* Set price
*
* @param float $price
* @return Product
*/
public function setPrice($price)
{
$this->price = $price;

return $this;
}

/**
* Get price
*
* @return float
*/
public function getPrice()
{
return $this->price;
}

/**
* Set updated_at
*
* @param \DateTime $updatedAt
* @return Product
*/
public function setUpdatedAt($updatedAt)
{
$this->updated_at = $updatedAt;

return $this;
}

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

/**
* Set created_at
*
* @param \DateTime $createdAt
* @return Product
*/
public function setCreatedAt($createdAt)
{
$this->created_at = $createdAt;

return $this;
}

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

/**
* Set category
*
* @param \Svipl\AdminBundle\Entity\Category $category
* @return Product
*/
public function setCategory(\Svipl\AdminBundle\Entity\Category $category = null)
{
$this->category = $category;

return $this;
}

/**
* Get category
*
* @return \Svipl\AdminBundle\Entity\Category
*/
public function getCategory()
{
return $this->category;
}

/**
* Set image
*
* @param string $image
* @return Product
*/
public function setImage($image)
{
$this->image = $image;

return $this;
}

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

private $temp;

/**
* Sets file.
*
* @param UploadedFile $file
*/
public function setFile(UploadedFile $file = null)
{
$this->file = $file;
// check if we have an old image path
if (isset($this->image)) {
// store the old name to delete after the update
$this->temp = $this->image;
$this->image = null;
} else {
$this->image = 'initial';
}
}

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

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

// if there is an error when moving the file, an exception will
// be automatically thrown by move(). This will properly prevent
// the entity from being persisted to the database on error
$this->getFile()->move($this->getUploadRootDir(), $this->image);

// check if we have an old image
if (isset($this->temp)) {
// delete the old image
unlink($this->getUploadRootDir().'/'.$this->temp);
// clear the temp image path
$this->temp = null;
}
$this->file = null;
}

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

配置.yml

...
liip_imagine:
filter_sets:
my_thumb:
quality: 75
filters:
thumbnail: { size: [120, 90], mode: outbound }

缩略图生成代码

...

<img src="{{ asset('uploads/product/' ~ form_object.vars.value.image) | imagine_filter('my_thumb', true) }}" />

...

正确生成缩略图。

但我无法找到在原始图像更改或使用表单删除时更新/删除缓存图像的方法。

最佳答案

您应该注册一个 preUpdate 和一个 preRemove event listener/subscriber ,注入(inject)所需的服务并删除其中的图像。

由于您无权访问服务容器(并且您不应将服务注入(inject)您的实体),您无法使用生命周期事件查询 LiipImagineBundle 的服务以从您的实体内部获取缓存文件。

你可以注入(inject)服务liip_imagine.cache.manager并使用它的 remove()从缓存中删除图像的方法。

关于php - 使用 liipImagineBundle 更新/删除记录时删除/更新缓存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18997954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com