我遇到了VichUploaderBundle的问题,我按照所有说明操作,我可以上传图像,现在我不知道如何使用树枝渲染图像。 我有一个与Photo具有OneToOne关系的Product实体(我使用带有VichUploaderBundle的实体照片)。
我的html.twig文件
{% for product in products %}
<img src="{{ vich_uploader_asset(product, 'image') }}" alt="{{ product.nombre }}" />
{% endfor %}
这给了我以下错误,
An exception has been thrown during the rendering of a template ("Impossible to determine the class name. Either specify it explicitly or give an object") in products/list_all_products.html.twig at line 9.
所以我在img标签中添加了以下内容
<img src="{{ vich_uploader_asset(product, 'image','AppBundle\Entity\Product') }}" alt="{{ product.nombre }}" />
并将此错误抛给我
An exception has been thrown during the rendering of a template ("Class AppBundleEntityProduct does not exist") in products/list_all_products.html.twig at line 9.
我的实体存储在AppBundle \ Entity \ *中,并且它也会删除斜杠。
我也尝试添加此功能但没有成功。
<img src="{{ vich_uploader_asset(product.photo, 'image','AppBundle\Entity\Product') }}" alt="{{ product.nombre }}" />
我的照片实体(它是捆绑说明中的副本和粘贴)
<?php
//src/AppBundle/Entity/Photo.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collection\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* @ORM\Entity
* @ORM\Table(name="photo")
* @Vich\Uploadable
*/
/*
This class represents the images
*/
class Photo
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @Vich\UploadableField(mapping="product_image", fileNameProperty="imageName")
*
* @var File $imageFile
*/
protected $imageFile;
/**
* @ORM\Column(type="string", length=255, name="image_name")
*
* @var string $imageName
*/
protected $imageName;
/**
* @ORM\Column(type="datetime")
*
* @var \DateTime $updatedAt
*/
protected $updatedAt;
/**
* If manually uploading a file (i.e. not using Symfony Form) ensure an instance
* of 'UploadedFile' is injected into this setter to trigger the update. If this
* bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
* must be able to accept an instance of 'File' as the bundle will inject one here
* during Doctrine hydration.
*
* @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
*/
public function setImageFile(File $image = null)
{
$this->imageFile = $image;
if ($image) {
// It is required that at least one field changes if you are using doctrine
// otherwise the event listeners won't be called and the file is lost
$this->updatedAt = new \DateTime('now');
}
}
/**
* @return File
*/
public function getImageFile()
{
return $this->imageFile;
}
/**
* @param string $imageName
*/
public function setImageName($imageName)
{
$this->imageName = $imageName;
}
/**
* @return string
*/
public function getImageName()
{
return $this->imageName;
}
}
这是我的产品实体
<?php
//src/AppBundle/Entity/Product.php
/*
This class represents a product, for instance, we'll be using
only product.
*/
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="product")
* ORM\Entity(repositoryClass="AppBundle\Repositories\ProductRepository")
*/
//extends objComercio has been removed for simplicity.
class Product
{
public function __construct()
{
$this->photos = new ArrayCollection();
}
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string",length=255, nullable=false)
*/
protected $nombre;
/**
* @ORM\Column(type="string",length=255, nullable=false)
*/
protected $descripcion;
/**
* @ORM\Column(type="integer",nullable=false)
*/
protected $precio;
/**
* @ORM\Column(type="string",length=255, nullable=false)
*/
protected $empresa;
/**
* @ORM\OneToOne(targetEntity="Photo", cascade={"persist"})
*/
protected $photo;
/**
* @ORM\ManyToOne(targetEntity="Store",inversedBy="products")
*/
protected $store_product;
public function getPhoto()
{
return $this->photo;
}
public function setPhoto(\AppBundle\Entity\Photo $photo)
{
$this->photo = $photo;
}
public function getPrecio()
{
return $this->precio;
}
public function setPrecio($aPrice)
{
$this->precio = $aPrice;
}
public function getEmpresa()
{
return $this->empresa;
}
public function setEmpresa($anEnterprise)
{
$this->empresa = $anEnterprise;
}
/**
* Set store_product
*
* @param \AppBundle\Entity\Store $storeProduct
* @return Product
*/
public function setStoreProduct(\AppBundle\Entity\Store $storeProduct = null)
{
$this->store_product = $storeProduct;
return $this;
}
/**
* Get store_product
*
* @return \AppBundle\Entity\Store
*/
public function getStoreProduct()
{
return $this->store_product;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set nombre
*
* @param string $nombre
* @return Product
*/
public function setNombre($nombre)
{
$this->nombre = $nombre;
return $this;
}
/**
* Get nombre
*
* @return string
*/
public function getNombre()
{
return $this->nombre;
}
/**
* Set descripcion
*
* @param string $descripcion
* @return Product
*/
public function setDescripcion($descripcion)
{
$this->descripcion = $descripcion;
return $this;
}
/**
* Get descripcion
*
* @return string
*/
public function getDescripcion()
{
return $this->descripcion;
}
}
我使用{{}}打印了所有内容,并且一切正常。
我不知道还有什么可做的。
提前致谢!
答案 0 :(得分:1)
我知道这已经很老了,但对谷歌来说仍然非常重要。我认为这应该有效:
加倍className的斜杠;
{{vich_uploader_asset(产品,&#39; imageFile&#39;,&#39; AppBundle \\ Entity \\产品&#39;)}}
答案 1 :(得分:0)
我认为您必须根据照片实体配置显示照片:
<img src="{{ vich_uploader_asset(product.photo, 'image') }}" alt="{{ product.nombre }}" />
或
<img src="{{ vich_uploader_asset(product.photo, 'file') }}" alt="{{ product.nombre }}" />
答案 2 :(得分:0)
我终于成功了。 我已经写了一些angularjs代码(我也在我的网站上使用它)。 这就是我所做的
我的main.js
$http.get('/get-products-by-user').success(function(data){
$scope.products = data;
})
的routing.yml
get_products_by_user:
path: /get-products-by-user
defaults: { _controller: AppBundle:Product:getAllProductsByUser}
ProductController的:getAllProductsByUser
public function getAllProductsByUserAction()
{
$products = $this->getDoctrine()
->getRepository('AppBundle:Product')
->findAllProductsByUser($this->getUser()->getId());
return new Response(json_encode($products),200);
}
我的list-all-products.html.twig行我渲染图片
<div ng-repeat="product in products | filter: query" >
<img ng-src="/images/products/{[{product.photo.imageName }]}" class="img-responsive img-thumbnail size-img" alt="{[{ product.nombre }]}"/></div>
我的config.yml,vich上传部分
mappings:
product_image:
uri_prefix: /images/products
upload_destination: %kernel.root_dir%/../web/images/products
我不知道这是否是使用捆绑包的好方法(它只是有效),我只是使用vichUploader上传图片,然后我做了一个查询以获得我所有的产品包括文件名,一旦我得到它,我使用uri_prefix / {[{product.imageName}]}来渲染图像。
({[{}}},我同时使用angularjs和twig模板引擎,这就是我使用该语法的原因)
答案 3 :(得分:0)
这是一个老问题,但这让我和Symfony,Doctrine和VichUploaderBundle的新手混淆了,这个问题在Google中最为相关。如果你弄错了,那么常见的Twig错误就是Mapping not found for field
我因Google原因而包含的内容!
Doctrine返回一个Product对象数组,其中一个Photo对象作为每个Product的子对象。这是照片子对象,vich_uploader_asset需要渲染图像。因此,使用dot访问每个产品对象的照片子对象:product.photo
,而不只是product
vich_uploader_asset的第二个参数是您在Photo实体中使用的字段名称,您在其中添加了UploadableField注释/配置。在上面的示例中,这是imageFile
,而不是image
。在vich_uploader_asset documentation中,image
是字段名称,因此您可能就是从那里复制该代码的地方。
vich_uploader_asset的第3个参数是指定可上载实体的类名,它同样不是Product而是Photo。但实际上你并不需要它,因为只要你指定product.photo
,vich就会知道它。但是如果你需要它,你需要包含2个反斜杠,如@StefanNch指出的那样。
所以这就是你需要的路线:
<img src="{{ vich_uploader_asset(product.photo, 'imageFile') }}" alt="{{ product.nombre }}" />
答案 4 :(得分:0)
试试这个日期是你的对象
<img src="{{ path ~ vich_uploader_asset(data, 'imageFile', 'App\\Entity\\Crente') }}" style="margin-top: -20px" />