Symfony从实体标题创建slug

时间:2014-12-13 22:10:01

标签: php symfony doctrine-orm doctrine slug

我有一个有效的博客,但我认为关于不错的网址有点迟了。

我不想使用slugable等捆绑包,因为我没有太多时间阅读文档并实现它们。

是否有可能到达实体的某个字段并从doctrine执行到db之前生成slug?

我在实体中想到了一个简单的解决方案,如:

public function __construct() {
        $this->setPostedAt(new \DateTime());
        $this->setSlug();
    }
public function setSlug(){
        $tmpslug = (string)$this->id."-";
        $tmpslug .= $this->slugify($this->title);

        $this->slug = $tmpslug;
    }

然而,当构造()调用时,id和title字段为空,这不起作用。

是否有任何快速解决方案不需要实施新的扩展?

谢谢!

2 个答案:

答案 0 :(得分:3)

我不会'认为Sluggable(来自DoctrineExtensions)将花费更多时间,而不是重新发明准备好的轮子。我使用它,需要10分钟才能使用。

  1. "stof/doctrine-extensions-bundle": "~1.1@dev"添加到composer.json
  2. 将配置添加到config.yml
  3. 配置:

    stof_doctrine_extensions:
        orm:
            default:
                uploadable: false
                sluggable: true
                timestampable: false
                translatable: false
                tree: false
                blameable: false
                loggable: false
                sortable: false
                softdeleteable: false
    
    1. slug字段和getter / setter添加到您的实体
    2. 代码:

      private $slug;
      public function getSlug() {...}
      public function setSlug($slug) {...}
      
      1. xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping"添加到ENTITY.orm.xml中的doctrine-mapping部分(如果您正在使用xml)
      2. 将slug字段添加到您的ENTITY.orm.xml中(如果您正在使用xml);
      3. 代码:

        <field name="slug" column="slug" type="string">
            <gedmo:slug fields="title(OR_YOUR_DESIRED_FIELD)" unique="true" updatable="true" />
        </field>
        

        它,你可以忘记它,你不需要设置,事件听众会照顾它..

答案 1 :(得分:0)

Okey..Just忘了Lifecycle Callbacks的学说功能。 所以答案不是将函数调用放在构造函数中,而是使用映射信息更新函数:

/**
    * @ORM\PrePersist
    * @ORM\PreUpdate
    */
    public function setSlug(){
        $tmpslug = (string)$this->id."-";
        $tmpslug = $this->slugify($this->title);

        $this->slug = $tmpslug;
    }

也不要忘记更新实体映射

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()