fpn / tag-bundle
FPN 标签包
Requires
- fpn/doctrine-extensions-taggable: v0.9.0
- symfony/framework-bundle: >=2.0
This package is not auto-updated.
Last update: 2024-09-14 12:13:59 UTC
README
此包为您的 Symfony 项目添加了标签功能,可以与任意数量的不同实体关联标签。此包集成了 DoctrineExtensions-Taggable 库,该库处理了大部分复杂的工作。
导航
安装
使用 Composer
您可以使用 composer 添加此包
``` sh
$ php composer.phar require fpn/tag-bundle
```
或者您可以直接编辑 composer.json 文件,并添加
"require": {
"fpn/tag-bundle":"dev-master",
}
注册包
要开始使用此包,请在 Kernel 中注册它。此文件通常位于 app/AppKernel
public function registerBundles()
{
$bundles = array(
// ...
new FPN\TagBundle\FPNTagBundle(),
);
)
创建您的 Tag
和 Tagging
实体
要使用此包,您需要创建两个新的实体:Tag
和 Tagging
。您可以将它们放置在任何包中,但每个都应如下所示
<?php namespace Acme\TagBundle\Entity; use FPN\TagBundle\Entity\Tag as BaseTag; class Tag extends BaseTag { }
<?php namespace Acme\TagBundle\Entity; use \FPN\TagBundle\Entity\Tagging as BaseTagging; class Tagging extends BaseTagging { }
接下来,您需要添加一些映射信息。一种方法是创建以下两个 XML 文件,并将它们放置在您的包的 Resources/config/doctrine
目录中
src/Acme/TagBundle/Resources/config/doctrine/Tag.orm.xml:
<?xml version="1.0" encoding="utf-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> <entity name="Acme\TagBundle\Entity\Tag" table="acme_tag"> <id name="id" column="id" type="integer"> <generator strategy="AUTO" /> </id> <one-to-many field="tagging" target-entity="Acme\TagBundle\Entity\Tagging" mapped-by="tag" fetch="EAGER" /> </entity> </doctrine-mapping>
src/Acme/TagBundle/Resources/config/doctrine/Tagging.orm.xml:
<?xml version="1.0" encoding="utf-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> <entity name="Acme\TagBundle\Entity\Tagging" table="acme_tagging"> <id name="id" column="id" type="integer"> <generator strategy="AUTO" /> </id> <many-to-one field="tag" target-entity="Acme\TagBundle\Entity\Tag"> <join-columns> <join-column name="tag_id" referenced-column-name="id" /> </join-columns> </many-to-one> <unique-constraints> <unique-constraint columns="tag_id,resource_type,resource_id" name="tagging_idx" /> </unique-constraints> </entity> </doctrine-mapping>
您还可以使用注解
src/Acme/TagBundle/Entity/Tag.php:
namespace Acme\TagBundle\Entity; use \FPN\TagBundle\Entity\Tag as BaseTag; use Doctrine\ORM\Mapping as ORM; /** * Acme\TagBundle\Entity\Tag * * @ORM\Table() * @ORM\Entity */ class Tag extends BaseTag { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\OneToMany(targetEntity="Tagging", mappedBy="tag", fetch="EAGER") **/ protected $tagging; }
src/Acme/TagBundle/Entity/Tagging.php:
namespace Acme\TagBundle\Entity; use \FPN\TagBundle\Entity\Tagging as BaseTagging; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping\UniqueConstraint; /** * Acme\TagBundle\Entity\Tagging * * @ORM\Table(uniqueConstraints={@UniqueConstraint(name="tagging_idx", columns={"tag_id", "resource_type", "resource_id"})}) * @ORM\Entity */ class Tagging extends BaseTagging { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="Tag") * @ORM\JoinColumn(name="tag_id", referencedColumnName="id") **/ protected $tag; }
在配置中定义类
在您的配置中,您需要定义标签和标记类。
yaml 示例
fpn_tag: model: tag_class: Acme\TagBundle\Entity\Tag tagging_class: Acme\TagBundle\Entity\Tagging
使实体可标记
假设我们有一个 Post
实体,并希望使其“可标记”。设置很简单:只需添加 Taggable
接口并添加必要的 3 个方法
<?php namespace Acme\BlogBundle\Entity; use DoctrineExtensions\Taggable\Taggable; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="acme_post") */ class Post implements Taggable { private $tags; public function getTags() { $this->tags = $this->tags ?: new ArrayCollection(); return $this->tags; } public function getTaggableType() { return 'acme_tag'; } public function getTaggableId() { return $this->getId(); } }
就这样!正如您将在下一节中看到的,标签管理器现在可以管理与您的实体关联的标签。
使用标签
此包通过使用“标签管理器”来工作,负责创建标签并将它们添加到您的实体中。有关一些很好的使用说明,请参阅 使用 TagManager。
基本思路是这样的。您不是直接在您的实体(例如 Post)上设置标签,而是使用标签管理器来设置标签。让我们看看从控制器内部看起来是怎样的。标签管理器作为 fpn_tag.tag_manager
服务可用
use Acme\BlogBundle\Entity\Post;
public function createTagsAction()
{
// create your entity
$post = new Post();
$post->setTitle('foo');
$tagManager = $this->get('fpn_tag.tag_manager');
// ask the tag manager to create a Tag object
$fooTag = $tagManager->loadOrCreateTag('foo');
// assign the foo tag to the post
$tagManager->addTag($fooTag, $post);
$em = $this->getDoctrine()->getEntityManager();
// persist and flush the new post
$em->persist($post);
$em->flush();
// after flushing the post, tell the tag manager to actually save the tags
$tagManager->saveTagging($post);
// ...
// Load tagging ...
$tagManager->loadTagging($post);
}