anh / doctrine-extensions-taggable
Doctrine2 可标记行为扩展
v1.1.4
2015-09-26 18:15 UTC
Requires
- php: >=5.4
- anh/doctrine-extensions-resource: 0.4.*
- doctrine/common: >=2.5.1|>=2.4.3
- doctrine/orm: >=2.5.1|>=2.4.8
Requires (Dev)
- phpunit/phpunit: ~4.6
README
安装
"require": { "anh/doctrine-extensions-taggable": "~1.0" }
Symfony
为此有扩展包 —— AnhTaggableBundle
基本集成
编辑 app/config/config.yml
doctrine: dbal: # ... orm: # ... mappings: taggable: type: annotation alias: AnhTaggable prefix: Anh\Taggable\Entity dir: "%kernel.root_dir%/../vendor/anh/doctrine-extensions-taggable/lib/Anh/Taggable/Entity"
编辑 Acme/DemoBundle/Resources/config/services.yml 添加一个服务和事件订阅者
# ... services: # ... anh_taggable.manager: class: Anh\Taggable\TaggableManager arguments: - @doctrine.orm.entity_manager - Anh\Taggable\Entity\Tag - Anh\Taggable\Entity\Tagging anh_taggable.subscriber: class: Anh\TaggableBundle\TaggableSubscriber arguments: - @service_container tags: - { name: doctrine.event_subscriber }
示例
创建可标记实体
<?php use Anh\Taggable\TaggableInterface; use Anh\Taggable\AbstractTaggable; class Article extends AbstractTaggable implements TaggableInterface { // ... public function getTaggableType() { return 'article'; } }
使用可标记扩展
<?php use Anh\Taggable\TaggableManager; use Anh\Taggable\TaggableSubscriber; // create entity manager // $em = EntityManager::create(...); // create taggable manager $taggableManager = new TaggableManager( $em, 'Anh\Taggable\Entity\Tag', 'Anh\Taggable\Entity\Tagging' ); // add event subscriber $em->getEventManager()->addEventSubscriber( new TaggableSubscriber($taggableManager) ); // create and fill entity $article = new Article(); // $article->setTitle(...); // add tag $tag = $taggableManager->loadOrCreateTag('This is a tag'); $article->addTag($tag); // or add multiple tags $tags = $taggableManager->loadOrCreateTags(array('tag1', 'tag2', 'tag3')); $article->addTags($tags); // see Anh\Taggable\AbstractTaggable for more $em->persist($article); $em->flush(); // ... // getting tagged resources $repository = $taggableManager->getTaggingRepository(); $tag = $taggableManager->loadOrCreateTag('Some tag') // returns all resources tagged with tag 'Some tag' $resources = $repository->getResourcesWithTag($tag); // returns only articles with tag 'Some tag' $articles = $repository->getResourcesWithTypeAndTag('article', $tag);