samj / doctrine-sluggable-bundle

Doctrine2实体sluggable行为的实现

v2.0 2014-01-02 00:06 UTC

This package is auto-updated.

Last update: 2024-09-05 15:55:32 UTC


README

DoctrineSluggableBundle为您的实体提供了Doctrine2的sluggable行为的优雅实现。

  • 为实体生成唯一slug的简单行为
  • 通过实现接口实现得很好
  • 确保slug不重复
  • 支持iconv/transliterate,例如:é -> e
  • 使用依赖注入,允许您实现自定义slugger

DoctrineSluggableBundle负责确保为您的实体生成的slug是唯一的。只需让您的实体实现SluggableInterface接口,您的实体将自动生成slug。

这使用了服务容器和依赖注入,这使得您能够轻松地创建自己的“Slugger”类。这支持您创建适合您领域问题的自定义slug。

本文档仍在建设中。然而,为任何感兴趣的人提供了一个示例,以开始对该包进行实验。

贡献者

安装

只需运行,假设您已安装composer.phar或composer二进制文件

$ php composer.phar require samj/doctrine-sluggable-bundle 2.0

然后在app/AppKernel.php中添加以下内容

new SamJ\DoctrineSluggableBundle\SamJDoctrineSluggableBundle(),

示例实体

示例 1

在此示例中,slug基于单个字段构建:注意:请确保实现getter方法getId和getTitle

代码

<?php

// --- YOUR NAMESPACE HERE ---
namespace SamJ\ExampleBundle\Entity;

use SamJ\DoctrineSluggableBundle\SluggableInterface;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table
 */
class SingleFieldExample implements SluggableInterface {
	/**
	 * @ORM\Id
	 * @ORM\Column(type="integer")
	 * @ORM\GeneratedValue
	 */
	protected $id;

	/**
	 * @ORM\Column(type="string")
	 */
	protected $title;

	/**
	 * @ORM\Column(type="string")
	 */
	protected $slug;
	
	// Implement methods for $id, $title, etc
		
	public function getSlug()
	{
		return $this->slug;
	}

	public function setSlug($slug)
	{
		if (!empty($this->slug)) return false;
		$this->slug = $slug;
	}

	public function getSlugFields() {
		return $this->getTitle();
	}
}

结果

当实体持久化时,$slug字段将被填充,为0-9、a-z,空格被转换为连字符("-"),基于标题字段。

例如:标题为Test Post的实体将具有slug为test-post

示例 2

在此示例中,slug基于多个单字段:注意:请确保实现getter方法getId、getTitle和getAuthor

代码

<?php

// --- YOUR NAMESPACE HERE ---
namespace SamJ\ExampleBundle\Entity;

use SamJ\DoctrineSluggableBundle\SluggableInterface;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table
 */
class MultipleSingleFieldExample implements SluggableInterface {
	/**
	 * @ORM\Id
	 * @ORM\Column(type="integer")
	 * @ORM\GeneratedValue
	 */
	protected $id;

	/**
	 * @ORM\Column(type="string")
	 */
	protected $title;

	/**
	 * @ORM\Column(type="string")
	 */
	protected $author;

	/**
	 * @ORM\Column(type="string")
	 */
	protected $slug;
	
	// Implement methods for $id, $title, $author, etc
		
	public function getSlug()
	{
		return $this->slug;
	}

	public function setSlug($slug)
	{
		if (!empty($this->slug)) return false;
		$this->slug = $slug;
	}

	public function getSlugFields() {
		return array($this->getAuthor(), $this->getTitle());
	}
}

结果

当实体持久化时,$slug字段将被填充,为0-9、a-z,空格被转换为连字符("-"),基于作者和标题字段。

例如:作者为Sam Jarrett和标题为Test Post的实体将具有slug为sam-jarrett-test-post

其他说明

此bundle使用名为“Slugger”的服务。您可以通过实现SluggerInterface->getSlug($fields)方法来实施自己的slugger行为(例如处理特定字段排序等)。在service.xml中配置服务容器,指定“sluggable.slugger.class”参数中的类。