PHPackages                             lemonde/phalcon-abtest - 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. lemonde/phalcon-abtest

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

lemonde/phalcon-abtest
======================

An AB testing library for Phalcon applications

4.1.0(1y ago)147.1k↓35.4%2[1 PRs](https://github.com/lemonde/phalcon-abtest/pulls)proprietaryPHPPHP ^8.4CI passing

Since Nov 22Pushed 3mo ago18 watchersCompare

[ Source](https://github.com/lemonde/phalcon-abtest)[ Packagist](https://packagist.org/packages/lemonde/phalcon-abtest)[ RSS](/packages/lemonde-phalcon-abtest/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (2)Versions (22)Used By (0)

Phalcon AB Test
================

[](#phalcon-ab-test)

Une librairie pour faire de l'AB Testing et du comptage de résultats

---

 [![](https://camo.githubusercontent.com/5c277c65e752d1d96b3517e2327fbf4b91b70751da2e850a56b5c506c27e554f/68747470733a2f2f7472617669732d63692e636f6d2f6c656d6f6e64652f7068616c636f6e2d66726f6e742e7376673f746f6b656e3d324e6341784455624751675a4251347047347970266272616e63683d6d6173746572)](https://travis-ci.com/lemonde/phalcon-abtest)

Pré-requis
----------

[](#pré-requis)

Pour fonctionner correctement vous devez exposer un service nommé `cache` dans l'injection de dépendance de phalcon.

Ce service doit, au minimum exposer 2 méthodes publiques: `hIncrBy` et `hScan`. Ces méthodes sont natives dans la classe `\Redis` (voir [`hIncrBy`](https://github.com/phpredis/phpredis#hincrby) et [`hScan`](https://github.com/phpredis/phpredis#hscan)). En utilisant la classe `\Phalcon\Cache\Backend\Redis` vous pouvez les définir comme suit :

```
namespace App;

class Redis extends \Phalcon\Cache\Backend\Redis {

    /**
     * @param string $key
     * @param string $hashKey
     * @param int $value
     * @return int
     */
    public function hIncrBy($key, $hashKey, $value)
    {
        return $this->_redis->hIncrBy($key, $hashKey, $value);
    }

    /**
     * @param string $key
     * @param string $pattern
     * @param int $count
     * @return array
     */
    public function hScan($key, &$iterator = null, $pattern = null, $count = 0)
    {
        $results = [];
        $this->_redis->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY);

        do {
            $arr_keys = $this->_getRedis()->hScan($key, $iterator, $pattern, $count);

            if (!$arr_keys) {
                break;
            }

            foreach ($arr_keys as $str_field => $str_value) {
                $results[$str_field] = $str_value;
            }
        } while ($arr_keys);

        return $results;
    }
}
```

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

[](#installation)

Versions :

- 1.X : Phalcon 3
- 2.X : Phalcon 4
- 3.X : Phalcon 5
- 4.X : Phalcon 5 and PHP 8.2
- 4.1 : Phalcon 5.9 and PHP 8.4

1. Ajouter la dépendance

    > Il faut rajouter le repository git dans votre configuration Composer
    >
    > ```
    > {
    >    "repositories": [
    >        {
    >            "type": "vcs",
    >            "url": "https://github.com/lemonde/phalcon-abtest.git"
    >        }
    >    ],
    > }
    >
    > ```

    ```
    composer require lemonde/phalcon-abtest

    ```
2. Ajouter les configurations PHP

    1. Ajouter le listener des évènements `dispatch`:

        ```
        $eventManager->attach('dispatch', new \ABTesting\Plugin\AnnotationListener());
        ```
    2. Ajouter l'extension volt:

        ```
        $volt->getCompiler()->addExtension(new \ABTesting\Volt\ABTestingExtension());
        ```
    3. Ajouter le contrôleur au routing:

        ```
        # il faut forcément un paramètre nommé testName
        # et un autre nommé winner
        $router->add('/_my_ab_redirection/{testName:[a-zA-Z0-9\_]+}/{winner:[a-zA-Z0-9\_]+}', ['controller' => 'ab_test', 'action' => 'count', 'namespace' => 'ABTesting\Controller'])->setName('ab_test_redirect');
        ```
    4. Spécifier le device du client, deux méthodes :

        - en le faisant manuellement depuis le contrôleur

        ```
        public function beforeExecuteRoute(Dispatcher $dispatcher)
        {
            ABTestEngine::getInstance()->setDevice('desktop');
        }
        ```

        - ou via un service nommé `phalcon-abtest.device_provider` qui implémente l'interface [DeviceProviderInterface.php](src/DeviceProvider/DeviceProviderInterface.php)

        ```
        $di->setShared('phalcon-abtest.device_provider', function () {
            return new class () extends ABTesting\DeviceProvider\DeviceProviderInterface {
                public function getDevice()
                {
                    return 'desktop';
                }
            }
        });
        ```

        Vous pouvez utiliser mobiledetect/mobiledetectlib via le service device\_provider:

        ```
        $di->setShared('phalcon-abtest.device_provider', function () {
            return new class () extends ABTesting\DeviceProvider\DeviceProviderInterface {
                public function getDevice()
                {
                    $detect = new MobileDetect();

                    if ($detect->isTablet()) {
                        return 'tablet';
                    } elseif ($detect->isMobile()) {
                        return 'mobile'
                    }

                    return 'desktop';
                }
            }
        });
        ```
    5. **(Optionnel)** Ajouter le reporting au routing:

        ```
        $router->add('/_my_ab_dashboard', ['controller' => 'ab_test', 'action' => 'report', 'namespace' => 'ABTesting\Controller'])->setName('ab_test_report');
        ```
3. Ajouter un service nommé `phalcon-abtest.tests` (utilisant `\Phalcon\Config`) renvoyant la configuration des tests A/B

    ```
    $di->setShared('phalcon-abtest.tests', function () {
        return new Phalcon\Config([
            'home_text_content' => [
                'default' => 'home_test_A',
                'variants' => [
                    'home_test_A' => 'something',
                    'home_test_B' => 'some other thing',
                ],
                'chooser' => [\ABTesting\Chooser\PercentChooser::class]
            ],
            'home_link_url' => [
                'default' => 'https://www.google.com',
                'variants' => [
                    'home_test_A' => 'https://www.google.fr',
                    'home_test_B' => 'https://www.google.be',
                ],
                'chooser' => [\ABTesting\Chooser\PercentChooser::class]
            ],
            'home_partial' => [
                'default' => 'path/to/default',
                'variants' => [
                    'home_test_A' => 'path/to/A',
                    'home_test_B' => 'path/to/B',
                ],
                'chooser' => [\ABTesting\Chooser\PercentChooser::class]
            ],
        ]);
    });
    ```

    Plus d'info [ici](#configuration-des-tests-ab)
4. Déclarer les actions soumises aux tests A/B avec l'annotation `@AbTesting('home_text_content')`
5. Utiliser les fonctions volt pour afficher les élements souhaités, par exemple :

    - pour tester un wording :

        ```

            {{ ab_test_result('home_text_content') }}

        ```
    - pour tester un lien défini comme test :

        ```

            Lien

        ```
    - pour tester 2 formats :

        ```
        {# home.volt #}

        {{ partial('path/to/specific/partial/dir/' ~ ab_test_result('home_partial')) }}
        ```

        ```
        {# path/to/specific/partial/dir/path/to/A.volt #}

            Lien

        ```

        ```
        {# path/to/specific/partial/dir/path/to/B.volt #}

            Lien

        ```

        ```
        {# path/to/specific/partial/dir/path/to/default.volt #}

            Lien

        ```

Configuration des tests A/B
---------------------------

[](#configuration-des-tests-ab)

Pour configurer vos tests A/B, tout se fait dans une conf en tableau sous la forme :

```
'nom_du_test' => [ # Définition du test
    'variants' => [ # Définition des résultats possibles
        'varianteA' => 'une valeur',
        'varianteB' => 'une autre valeur',
        'varianteC' => 1337,
    ],
    'default' => 'valeur par défaut', # Valeur par défaut du résultat (s'il n'y a pas eu de bataille par exemple)
    'chooser' => ['\La\Classe\Du\Chooser', 'les', 'arguments', 'du', 'constructeur']
]
```

- Les variantes peuvent être de n'importe quel type compatible avec `var_export`.
- Le chooser doit être une classe qui implémente `ABTesting\Chooser\ChooserInterface`
- Vous pouvez écouter sur les évenements de l' `ABTesting\Engine` :
    - `abtest:beforeBattle`: avant le calcul d'un test
    - `abtest:afterBattle`: après le calcul d'un test
    - `abtest:beforePrint`: avant l'affichage du résultat via volt
    - `abtest:beforeClick`: avant la redirection via le lien du test

Exécuter les tests en local
===========================

[](#exécuter-les-tests-en-local)

- Build l'image de test en local

```
docker build --no-cache -t phalcon-abtest .
```

- Lancer le conteneur et ouvrir une session bash

```
docker run --rm -it -v "$PWD":/app phalcon-abtest
```

- installer les packages PHP

```
composer install
```

- Exécuter les tests

```
./vendor/bin/phpunit --no-coverage
```

###  Health Score

53

—

FairBetter than 97% of packages

Maintenance65

Regular maintenance activity

Popularity31

Limited adoption so far

Community17

Small or concentrated contributor base

Maturity84

Battle-tested with a long release history

 Bus Factor2

2 contributors hold 50%+ of commits

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 ~140 days

Recently: every ~164 days

Total

15

Last Release

407d ago

Major Versions

1.2.1 → 2.0.02023-06-23

2.0.0 → 3.0.02023-07-24

3.0.1 → 4.0.02024-10-15

PHP version history (2 changes)4.0.0PHP ^8.2

4.1.0PHP ^8.4

### Community

Maintainers

![](https://www.gravatar.com/avatar/a1d4335aebe1327d339a91f287bae40896ef5c3b198e93b504b85ebe1666c1cd?d=identicon)[sachoo](/maintainers/sachoo)

---

Top Contributors

[![senorihl](https://avatars.githubusercontent.com/u/4668415?v=4)](https://github.com/senorihl "senorihl (25 commits)")[![nangot](https://avatars.githubusercontent.com/u/52910874?v=4)](https://github.com/nangot "nangot (23 commits)")[![briazh](https://avatars.githubusercontent.com/u/6680541?v=4)](https://github.com/briazh "briazh (4 commits)")[![Simoes404](https://avatars.githubusercontent.com/u/52157488?v=4)](https://github.com/Simoes404 "Simoes404 (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/lemonde-phalcon-abtest/health.svg)

```
[![Health](https://phpackages.com/badges/lemonde-phalcon-abtest/health.svg)](https://phpackages.com/packages/lemonde-phalcon-abtest)
```

###  Alternatives

[jstewmc/usps-address

A simple PHP class for United States Postal Service (USPS) addresses

1211.0k](/packages/jstewmc-usps-address)

PHPackages © 2026

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