avoo / achievement-bundle
成就包
Requires
- php: >=5.5.9
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-26 00:24:47 UTC
README
![Build Status] (https://scrutinizer-ci.com/g/avoo/AchievementBundle/badges/build.png?b=master) ![Scrutinizer Code Quality] (https://scrutinizer-ci.com/g/avoo/AchievementBundle/badges/quality-score.png?b=master) ![Latest Stable Version] (https://poser.pugx.org/avoo/achievement-bundle/v/stable.svg) ![License] (https://poser.pugx.org/avoo/achievement-bundle/license.svg)
Symfony 2的成就包
安装
在您的composer.json
文件中添加avoo/achievement-bundle
{ "require": { "avoo/achievement-bundle": "~1.0" } }
在app/AppKernel.php
中注册此包
// app/AppKernel.php public function registerBundles() { return array( // ... new Avoo\AchievementBundle\AvooAchievementBundle(), ); }
默认配置
用户类
您需要实现Avoo\AchievementBundle\Model\UserInterface
,考虑在AppBundle\Entity\User
中的用户类。
以FOS为例
namespace AppBundle\Entity; use Avoo\AchievementBundle\Model\UserInterface; use FOS\UserBundle\Model\User as BaseUser; /** * Class User */ class User extends BaseUser implements UserInterface { /** * @var integer $id */ protected $id; /** * @var array $achievements */ protected $achievements; /** * {@inheritdoc} */ public function getAchievements() { return $this->achievements; } }
用户成就类
类
namespace AppBundle\Entity; use Avoo\AchievementBundle\Entity\UserAchievement as BaseUserAchievement; use Avoo\AchievementBundle\Model\UserInterface; /** * Class UserAchievement */ class UserAchievement extends BaseUserAchievement { /** * @var UserInterface $user */ protected $user; }
Doctrine配置
在用户类中
YML
# src/AppBundle/Resources/config/doctrine/User.orm.yml AppBundle\Entity\User: type: entity oneToMany: achievements: targetEntity: AppBundle\Entity\UserAchievement mappedBy: user
XML
<?xml version="1.0" encoding="UTF-8"?> <!-- src/AppBundle/Resources/config/doctrine/User.orm.xml --> <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="AppBundle\Entity\User" table="fos_user"> <one-to-many field="achievements" target-entity="AppBundle\Entity\UserAchievement" mapped-by="user" /> </entity> </doctrine-mapping>
注解
namespace Avoo\EloBundle\Entity; use Avoo\AchievementBundle\Model\UserInterface; use FOS\UserBundle\Model\User as BaseUser; use Doctrine\ORM\Mapping as ORM; class User extends BaseUser implement UserInterface { /** * @OneToMany(targetEntity="AppBundle\Entity\UserAchievement", mappedBy="user") */ protected $achievements; /** * {@inheritdoc} */ public function getAchievements() { return $this->achievements; } }
现在将用户成就类与您的用户类链接起来。
YML
# src/AppBundle/Resources/config/doctrine/UserAchievement.orm.yml AppBundle\Entity\UserAchievement: type: entity repositoryClass: Avoo\AchievementBundle\Repository\UserAchievementRepository table: avoo_user_achievement id: id: type: integer generator: strategy: AUTO manyToOne: user: targetEntity: AppBundle\Entity\User inversedBy: achievements joinColumn: name: user_id referencedColumnName: id nullable: false
XML
<?xml version="1.0" encoding="utf-8"?> <!-- src/AppBundle/Resources/config/doctrine/UserAchievement.orm.xml --> <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="AppBundle\Entity\UserAchievement" table="avoo_user_achievement" repository-class="Avoo\AchievementBundle\Repository\UserAchievementRepository"> <id name="id" type="integer" column="id"> <generator strategy="AUTO"/> </id> <many-to-one target-entity="AppBundle\Entity\User" field="user" inversed-by="achievements"> <join-column name="user_id" nullable="false" /> </many-to-one> </entity> </doctrine-mapping>
注解
namespace Avoo\EloBundle\Entity; use Avoo\AchievementBundle\Entity\UserAchievement as BaseUserAchievement; use Doctrine\ORM\Mapping as ORM; class UserAchievement extends BaseUserAchievement { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="AppBundle\Entity\UserAchievement", inversedBy="achievements") * @ORM\JoinColumn(name="user_id", referencedColumnName="id") */ protected $user; }
成就配置
定义用户成就类
# app/config/config.yml avoo_achievement: user_achievement_class: AppBundle\Entity\UserAchievement
添加成就
# app/config/config.yml avoo_achievement: achievements: my_category: # it's the category of achievements my_super_achievement: class: AppBundle\Listener\SuperAchievementListener #The class handle the event. name: Test #Achievement name (Use the real name or the translate file, ex: achievement.global.my_super_achievement.name). value: 3 #The value for unlock achievement, must be an integer or float. description: My super description #Optional field. The achievement description, you can use the translation file. image: bundles/app/images/my_beautiful_image.png #Optional field. mega_achievement: class: AppBundle\Listener\OtherListener name: achievement.my_super_achievement.mega_achievement.name description: achievement.my_super_achievement.mega_achievement.description value: 100 other_category: mega_achievement: class: AppBundle\Listener\OtherListener name: Achievement name value: 50
监听器实现
成就监听器示例
namespace AppBundle\Listener; use Avoo\AchievementBundle\Listener\AchievementListener; /** * Class SuperAchievementListener * */ class SuperAchievementListener extends AchievementListener { }
这就完成了。
默认用法
请注意,如果您想查看成就进度,您需要登录!
您可以在视图中使用默认的成就渲染
{{ render(controller('AvooAchievementBundle:Achievement:overview')) }} {# List all achievements #} {{ render(controller('AvooAchievementBundle:Achievement:categories')) }} {# List of achievements categories #} {{ render(controller('AvooAchievementBundle:Achievement:achievementsByCategory', {'category' : 'my_category'})) }} {# All achievements for unique category #} {{ render(controller('AvooAchievementBundle:Achievement:locked')) }} {# Locked achievements #} {{ render(controller('AvooAchievementBundle:Achievement:inProgress')) }} {# Achievements in progress #} {{ render(controller('AvooAchievementBundle:Achievement:unlocked')) }} {# Unlocked achievements #} {{ render(controller('AvooAchievementBundle:Achievement:latest', {'limit', 2})) }} {# The last earned achievements (limit is optional) #} {{ render(controller('AvooAchievementBundle:Achievement:earnedByCategory')) }} {# The list of earned achievements by categories #}
默认进度
进度示例
public function indexAction(Request $request) { $achievement = $this->get('avoo_achievement'); $achievement->get('my_category.my_super_achievement')->progress(2); // Return true or false }
检查当前成就是否已获得
public function indexAction(Request $request) { $achievement = $this->get('avoo_achievement'); $achievement->get('my_category.my_super_achievement')->isComplete(); // Return true or false }
成就验证,您可以在监听器类中通过isValid
函数实现自己的验证过程
namespace AppBundle\Listener; use Avoo\AchievementBundle\Listener\AchievementListener; /** * Class SuperAchievementListener * */ class SuperAchievementListener extends AchievementListener { public function isValid($object = null) { //My validation process } }
现在调用
public function indexAction(Request $request) { $listener = $this->get('avoo_achievement')->get('my_category.my_super_achievement'); if ($listener->isValid()) { $listener->progress(1); } }
或重写progress
函数
namespace AppBundle\Listener; use Avoo\AchievementBundle\Listener\AchievementListener; /** * Class SuperAchievementListener * */ class SuperAchievementListener extends AchievementListener { public function progress($value) { //My progress process } }
许可协议
此包根据MIT许可协议发布。请参阅包中的完整许可协议