phpsymfonydoctrine

Use doctrine in a personalized class


I have a Util class in a Symfony 2.4 proyect that get the slug from a book. The slug cannot be repeated. Each slug must be unique. I have the following code form the class that generate the slug. I have the error:

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;
       }
}

It is mi Entity "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;
    }
}

How can I make a consult that check that the slug is not in the database form the Uti Class?

Thanks for all and sorry for my English


Solution

  • The problem is you are trying refer to a property from static method. Don't do it unless the property is also static.

    The best way I can suggest is change the static method into not-static, then create a service from Util class, and make validation outside the entity. It's not a good idea using service inside entity class.

    You didn't show the context but I can guess: if you want set slug based on a form - then the best way to achieve what you want would be create a validator.