我有slugify方法,每次更改时都会强制实体类的title属性。 所以我把这个方法放在实体类中并像这样调用它:
public function setTitle($t){
$this->title = $t;
$this->slugTitle = $this->slugify($t);
}
它适用于我,但如果我有多个类使用slugify方法,我应该将这个方法放在所有这些中,这就是代码重复。
那我该怎么办?如果使用帮助程序类我不能像上面的方法一样使用slugify(): - (。
答案 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)
有一个包你可以为你做这件事。
答案 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{
}