我在Symfony 2.4 proyect中有一个Util类,可以从书中获取slug。 slu can不能重复。每个slug必须是唯一的。我有以下代码形成生成slug的类。我有错误:
Fatal error: Using $this when not in object context in C:\xampp\htdocs\gens\src\
Sakya\GensBundle\Util\Util.php on line 38
namespace Sakya\GensBundle\Util;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityManager;
class Util
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public static function getSlug($slug)
{
$separador = '-';
$tildes=array('á','é','í','ó','ú');
$vocales=array('a','e','i','o','u');
str_replace($vocales,$tildes,$slug);
$slug = iconv('UTF-8', 'ASCII//TRANSLIT', $slug);
$slug = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $slug);
$slug = strtolower(trim($slug, $separador));
$slug = preg_replace("/[\/_|+ -]+/", $separador, $slug);
$i = 1;
while (! $this->em->getRepository("GensBundle:Libro")->findBySlug($slug)){
$slug = $slug."-".$i;
$i++;
}
return $slug;
}
}
这是mi实体“Libro”
<?php
namespace Sakya\GensBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Sakya\GensBundle\Util\Util;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Libro
*
* @ORM\Table()
* @ORM\Entity
*/
class Libro
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="libro", type="string", length=255)
*/
private $libro;
/**
* @ORM\Column(type="string")
*
* @Assert\NotBlank()
*/
protected $slug;
/**
* @var string
*
* @ORM\Column(name="autor", type="string", length=255)
*/
private $autor;
/**
* @var string
*
* @ORM\Column(name="prefacio", type="string", length=700)
*/
private $prefacio;
/**
* @ORM\OneToMany(targetEntity="Capitulo", mappedBy="libro")
*/
private $capitulo;
public function __toString()
{
return $this->getLibro();
}
/**
* Constructor
*/
public function __construct()
{
$this->capitulo = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set libro
*
* @param string $libro
* @return Libro
*/
public function setLibro($libro)
{
$this->libro = $libro;
$this->slug = Util::getSlug($libro);
return $this;
}
/**
* Get libro
*
* @return string
*/
public function getLibro()
{
return $this->libro;
}
/**
* Set autor
*
* @param string $autor
* @return Libro
*/
public function setAutor($autor)
{
$this->autor = $autor;
return $this;
}
/**
* Get autor
*
* @return string
*/
public function getAutor()
{
return $this->autor;
}
/**
* Add capitulo
*
* @param \Sakya\GensBundle\Entity\Capitulo $capitulo
* @return Libro
*/
public function addCapitulo(\Sakya\GensBundle\Entity\Capitulo $capitulo)
{
$this->capitulo[] = $capitulo;
return $this;
}
/**
* Remove capitulo
*
* @param \Sakya\GensBundle\Entity\Capitulo $capitulo
*/
public function removeCapitulo(\Sakya\GensBundle\Entity\Capitulo $capitulo)
{
$this->capitulo->removeElement($capitulo);
}
/**
* Get capitulo
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getCapitulo()
{
return $this->capitulo;
}
/**
* Set prefacio
*
* @param string $prefacio
* @return Libro
*/
public function setPrefacio($prefacio)
{
$this->prefacio = $prefacio;
return $this;
}
/**
* Get prefacio
*
* @return string
*/
public function getPrefacio()
{
return $this->prefacio;
}
/**
* Set slug
*
* @param string $slug
* @return Libro
*/
public function setSlug($slug)
{
$this->slug = $slug;
return $this;
}
/**
* Get slug
*
* @return string
*/
public function getSlug()
{
return $this->slug;
}
}
如何通过Uti类检查slug不在数据库中?
谢谢大家,对不起我的英语
答案 0 :(得分:2)
问题是你正在尝试从静态方法引用属性。除非财产也是静态的,否则不要这样做。
我建议的最好方法是将静态方法更改为非静态方法,然后从Util类创建服务,并在实体外部进行验证。在实体类中使用服务并不是一个好主意。
你没有显示上下文,但我可以猜测:如果你想根据表单设置slug - 那么实现你想要的最好的方法就是创建一个验证器。