PHPackages                             avoo/achievement-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. avoo/achievement-bundle

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

avoo/achievement-bundle
=======================

Achievement bundle

1.0.1(10y ago)0711MITPHPPHP &gt;=5.5.9

Since Feb 24Pushed 6y ago1 watchersCompare

[ Source](https://github.com/avoo/AchievementBundle)[ Packagist](https://packagist.org/packages/avoo/achievement-bundle)[ RSS](/packages/avoo-achievement-bundle/feed)WikiDiscussions master Synced 4w ago

READMEChangelogDependencies (1)Versions (3)Used By (0)

AchievementBundle
=================

[](#achievementbundle)

[!\[Build Status\] (https://scrutinizer-ci.com/g/avoo/AchievementBundle/badges/build.png?b=master)](https://scrutinizer-ci.com/g/avoo/AchievementBundle/build-status/master)[!\[Scrutinizer Code Quality\] (https://scrutinizer-ci.com/g/avoo/AchievementBundle/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/avoo/AchievementBundle/?branch=master)[!\[Latest Stable Version\] (https://poser.pugx.org/avoo/achievement-bundle/v/stable.svg)](https://packagist.org/packages/avoo/achievement-bundle)[!\[License\] (https://poser.pugx.org/avoo/achievement-bundle/license.svg)](https://packagist.org/packages/avoo/achievement-bundle)

Achievement bundle for Symfony 2

- [Installation](#installation)
- [Configuration](#default-configuration)
- [User Achievement class](#user-achievement-class)
- [Doctrine configuration](#doctrine-configuration)
- [Achievement configuration](#achievement-configuration)
- [Listener implementation](#listener-implementation)
- [Default Usage](#default-usage)
- [Default Progression](#default-progression)

Installation
------------

[](#installation)

Require [`avoo/achievement-bundle`](https://packagist.org/packages/avoo/achievement-bundle) into your `composer.json` file:

```
{
    "require": {
        "avoo/achievement-bundle": "~1.0"
    }
}
```

Register the bundle in `app/AppKernel.php`:

```
// app/AppKernel.php
public function registerBundles()
{
    return array(
        // ...
        new Avoo\AchievementBundle\AvooAchievementBundle(),
    );
}
```

Default Configuration
---------------------

[](#default-configuration)

#### User class

[](#user-class)

You need to implement `Avoo\AchievementBundle\Model\UserInterface`, consider the user class in `AppBundle\Entity\User`.

for FOS example:

```
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;
    }
}
```

#### User Achievement class

[](#user-achievement-class)

**Class**

```
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 configuration

[](#doctrine-configuration)

In the user class:

**YML**

```
# src/AppBundle/Resources/config/doctrine/User.orm.yml
AppBundle\Entity\User:
    type:  entity
    oneToMany:
        achievements:
            targetEntity: AppBundle\Entity\UserAchievement
            mappedBy: user
```

**XML**

```

```

**Annotation**

```
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;
    }
}
```

And now linked the user achievement class with your own user class.

**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**

```

```

**Annotation**

```
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;
}
```

#### Achievement configuration

[](#achievement-configuration)

Define the user achievement class

```
# app/config/config.yml

avoo_achievement:
    user_achievement_class: AppBundle\Entity\UserAchievement
```

**Add achievement**

```
# 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
```

Listener implementation
-----------------------

[](#listener-implementation)

#### Achievement listener example

[](#achievement-listener-example)

```
namespace AppBundle\Listener;

use Avoo\AchievementBundle\Listener\AchievementListener;

/**
 * Class SuperAchievementListener
 *
 */
class SuperAchievementListener extends AchievementListener
{
}
```

That's all.

Default Usage
-------------

[](#default-usage)

**Be careful, if you want to see the achievement progress, you need to be logged!**

You can use the default achievement rendering in your views:

```
{{ 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 #}
```

Default Progression
-------------------

[](#default-progression)

Progress example:

```
public function indexAction(Request $request)
{
    $achievement = $this->get('avoo_achievement');

    $achievement->get('my_category.my_super_achievement')->progress(2); // Return true or false
}
```

Check if current achievement is earned:

```
public function indexAction(Request $request)
{
    $achievement = $this->get('avoo_achievement');

    $achievement->get('my_category.my_super_achievement')->isComplete(); // Return true or false
}
```

Achievement validation, you can implement your own validation process with `isValid` function in your listener class:

```
namespace AppBundle\Listener;

use Avoo\AchievementBundle\Listener\AchievementListener;

/**
 * Class SuperAchievementListener
 *
 */
class SuperAchievementListener extends AchievementListener
{
    public function isValid($object = null)
    {
        //My validation process
    }
}
```

And now call:

```
public function indexAction(Request $request)
{
    $listener = $this->get('avoo_achievement')->get('my_category.my_super_achievement');
    if ($listener->isValid()) {
        $listener->progress(1);
    }
}
```

Or override `progress` function:

```
namespace AppBundle\Listener;

use Avoo\AchievementBundle\Listener\AchievementListener;

/**
 * Class SuperAchievementListener
 *
 */
class SuperAchievementListener extends AchievementListener
{
    public function progress($value)
    {
        //My progress process
    }
}
```

License
-------

[](#license)

This bundle is released under the MIT license. See the complete license in the bundle:

[License](https://github.com/avoo/AchievementBundle/blob/master/LICENSE)

###  Health Score

27

—

LowBetter than 47% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 88.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

3778d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6b8ee83ffc36845dc3d1092cd98dbf56fc2cffd8e46b2d04b777959992cb60eb?d=identicon)[avoo](/maintainers/avoo)

---

Top Contributors

[![avoo](https://avatars.githubusercontent.com/u/6162605?v=4)](https://github.com/avoo "avoo (16 commits)")[![emulienfou](https://avatars.githubusercontent.com/u/84061?v=4)](https://github.com/emulienfou "emulienfou (2 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/avoo-achievement-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/avoo-achievement-bundle/health.svg)](https://phpackages.com/packages/avoo-achievement-bundle)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
