在个性化课程中使用学说

时间:2013-12-27 19:30:10

标签: symfony doctrine

我在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不在数据库中?

谢谢大家,对不起我的英语

1 个答案:

答案 0 :(得分:2)

问题是你正在尝试从静态方法引用属性。除非财产也是静态的,否则不要这样做。

我建议的最好方法是将静态方法更改为非静态方法,然后从Util类创建服务,并在实体外部进行验证。在实体类中使用服务并不是一个好主意。

你没有显示上下文,但我可以猜测:如果你想根据表单设置slug - 那么实现你想要的最好的方法就是创建一个验证器。