其中为symfony2实体添加了slugify方法

时间:2014-12-12 10:52:40

标签: php oop symfony design-patterns doctrine-orm

我有slugify方法,每次更改时都会强制实体类的title属性。 所以我把这个方法放在实体类中并像这样调用它:

public function setTitle($t){
  $this->title = $t;
  $this->slugTitle = $this->slugify($t);
}

它适用于我,但如果我有多个类使用slugify方法,我应该将这个方法放在所有这些中,这就是代码重复。

那我该怎么办?如果使用帮助程序类我不能像上面的方法一样使用slugify(): - (。

4 个答案:

答案 0 :(得分:2)

您可以使用Doctrine event listener/subscriber收听实体更改并对其进行操作。

namespace Acme\DemoBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;

class SlugifyListener
{
    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        // do something with $entity...
    }
}

的services.xml

<service id="my.listener" class="Acme\DemoBundle\EventListener\SlugifyListener">
    <tag name="doctrine.event_listener" event="preUpdate" />
</service>

但是在这种情况下,你最好看看Doctrine Extensions bundle。它提供了一个Sluggable扩展,可以为您完成此任务,而不是重新发明轮子。

答案 1 :(得分:1)

为了快速修复,您可以创建某种%Bundle%/Utils/Utils.php类(可以是静态的),将函数放在那里并像使用它一样使用

use MyBundle/Utils/Utils;

class Someclass {
// ...
$this->slugTitle = Utils::slugify($t);

更复杂的方法是使用Gedmo's Doctrine Extensions。它为你处理这种行为。

答案 2 :(得分:0)

有一个包你可以为你做这件事。

它被称为Sluggable behavior extension for Doctrine 2

答案 3 :(得分:0)

为什么不用你的slugify函数创建一个基类(事实上,如果所有的孩子都有一个标题并且需要阻塞,那么整个setTitle可以在基类中)然后从你的所有实体类继承它?

class slugclass{

  $title
  $slugtitle

  public function setTitle($t){
      $this->title = $t;
      $this->slugTitle = $this->slugify($t);
  }

  public function slugify($t){
     ...sluggify code
  }

}


class childentity extends slugclass{

}