{"id":15782356,"url":"https://github.com/aerendir/bundle-features","last_synced_at":"2025-04-24T07:23:01.014Z","repository":{"id":37884926,"uuid":"76975007","full_name":"Aerendir/bundle-features","owner":"Aerendir","description":"A Symfony bundle to manage features and plans","archived":false,"fork":false,"pushed_at":"2025-03-19T17:06:09.000Z","size":1623,"stargazers_count":11,"open_issues_count":16,"forks_count":1,"subscribers_count":3,"default_branch":"dev","last_synced_at":"2025-04-21T12:55:52.524Z","etag":null,"topics":["php","symfony","symfony-bundle"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Aerendir.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-12-20T16:56:23.000Z","updated_at":"2025-03-19T17:06:13.000Z","dependencies_parsed_at":"2024-03-22T05:25:36.522Z","dependency_job_id":"6df90e29-c0f8-400f-a278-8b636ccb30be","html_url":"https://github.com/Aerendir/bundle-features","commit_stats":{"total_commits":715,"total_committers":3,"mean_commits":"238.33333333333334","dds":0.5006993006993007,"last_synced_commit":"2742a00d81e9bddd4668fb2a3b01399f149d8e40"},"previous_names":[],"tags_count":39,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aerendir%2Fbundle-features","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aerendir%2Fbundle-features/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aerendir%2Fbundle-features/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aerendir%2Fbundle-features/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aerendir","download_url":"https://codeload.github.com/Aerendir/bundle-features/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250581195,"owners_count":21453617,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php","symfony","symfony-bundle"],"created_at":"2024-10-04T19:06:12.701Z","updated_at":"2025-04-24T07:23:00.997Z","avatar_url":"https://github.com/Aerendir.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"http://www.serendipityhq.com\" target=\"_blank\"\u003e\n        \u003cimg style=\"max-width: 350px\" src=\"http://www.serendipityhq.com/assets/open-source-projects/Logo-SerendipityHQ-Icon-Text-Purple.png\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eSerendipity HQ Features Bundle\u003c/h1\u003e\n\u003cp align=\"center\"\u003eFeatures Bundle helps you manage paid features and plans in your Symfony app.\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/Aerendir/bundle-features/releases\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/serendipity_hq/bundle-features.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/Aerendir/bundle-features/releases\"\u003e\u003cimg src=\"https://img.shields.io/packagist/php-v/serendipity_hq/bundle-features?color=%238892BF\u0026style=flat-square\u0026logo=php\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003e\n    Supports:\n    \u003ca title=\"Supports Symfony ^4.4\" href=\"https://github.com/Aerendir/bundle-aws-ses-monitor/actions?query=branch%3Adev\"\u003e\u003cimg title=\"Supports Symfony ^4.4\" src=\"https://img.shields.io/badge/Symfony-%5E4.4-333?style=flat-square\u0026logo=symfony\" /\u003e\u003c/a\u003e\n    \u003ca title=\"Supports Symfony ^5.4\" href=\"https://github.com/Aerendir/bundle-aws-ses-monitor/actions?query=branch%3Adev\"\u003e\u003cimg title=\"Supports Symfony ^5.4\" src=\"https://img.shields.io/badge/Symfony-%5E5.4-333?style=flat-square\u0026logo=symfony\" /\u003e\u003c/a\u003e\n    \u003ca title=\"Supports Symfony ^6.0\" href=\"https://github.com/Aerendir/bundle-aws-ses-monitor/actions?query=branch%3Adev\"\u003e\u003cimg title=\"Supports Symfony ^6.0\" src=\"https://img.shields.io/badge/Symfony-%5E6.0-333?style=flat-square\u0026logo=symfony\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003e\n    Tested with:\n    \u003ca title=\"Tested with Symfony ^4.4\" href=\"https://github.com/Aerendir/bundle-aws-ses-monitor/actions?query=branch%3Adev\"\u003e\u003cimg title=\"Tested with Symfony ^4.4\" src=\"https://img.shields.io/badge/Symfony-%5E4.4-333?style=flat-square\u0026logo=symfony\" /\u003e\u003c/a\u003e\n    \u003ca title=\"Tested with Symfony ^5.4\" href=\"https://github.com/Aerendir/bundle-aws-ses-monitor/actions?query=branch%3Adev\"\u003e\u003cimg title=\"Tested with Symfony ^5.4\" src=\"https://img.shields.io/badge/Symfony-%5E5.4-333?style=flat-square\u0026logo=symfony\" /\u003e\u003c/a\u003e\n    \u003ca title=\"Tested with Symfony ^6.0\" href=\"https://github.com/Aerendir/bundle-aws-ses-monitor/actions?query=branch%3Adev\"\u003e\u003cimg title=\"Tested with Symfony ^6.0\" src=\"https://img.shields.io/badge/Symfony-%5E6.0-333?style=flat-square\u0026logo=symfony\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.php.net/manual/en/book.iconv.php\"\u003e\u003cimg src=\"https://img.shields.io/badge/Suggests-ext--iconv-%238892BF?style=flat-square\u0026logo=php\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.php.net/manual/en/book.intl.php\"\u003e\u003cimg src=\"https://img.shields.io/badge/Suggests-ext--intl-%238892BF?style=flat-square\u0026logo=php\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.php.net/manual/en/book.json.php\"\u003e\u003cimg src=\"https://img.shields.io/badge/Suggests-ext--json-%238892BF?style=flat-square\u0026logo=php\"\u003e\u003c/a\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Suggests-serendipity__hq/component--text--matrix-%238892BF?style=flat-square\"\u003e\n\u003c/p\u003e\n\n## Current Status\n\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Aerendir_bundle-features\u0026metric=coverage)](https://sonarcloud.io/dashboard?id=Aerendir_bundle-features)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Aerendir_bundle-features\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=Aerendir_bundle-features)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Aerendir_bundle-features\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=Aerendir_bundle-features)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=Aerendir_bundle-features\u0026metric=reliability_rating)](https://sonarcloud.io/dashboard?id=Aerendir_bundle-features)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=Aerendir_bundle-features\u0026metric=security_rating)](https://sonarcloud.io/dashboard?id=Aerendir_bundle-features)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=Aerendir_bundle-features\u0026metric=sqale_index)](https://sonarcloud.io/dashboard?id=Aerendir_bundle-features)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=Aerendir_bundle-features\u0026metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=Aerendir_bundle-features)\n\n[![Phan](https://github.com/Aerendir/bundle-features/workflows/Phan/badge.svg)](https://github.com/Aerendir/bundle-features/actions?query=branch%3Adev)\n[![PHPStan](https://github.com/Aerendir/bundle-features/workflows/PHPStan/badge.svg)](https://github.com/Aerendir/bundle-features/actions?query=branch%3Adev)\n[![PSalm](https://github.com/Aerendir/bundle-features/workflows/PSalm/badge.svg)](https://github.com/Aerendir/bundle-features/actions?query=branch%3Adev)\n[![PHPUnit](https://github.com/Aerendir/bundle-features/workflows/PHPunit/badge.svg)](https://github.com/Aerendir/bundle-features/actions?query=branch%3Adev)\n[![Composer](https://github.com/Aerendir/bundle-features/workflows/Composer/badge.svg)](https://github.com/Aerendir/bundle-features/actions?query=branch%3Adev)\n[![PHP CS Fixer](https://github.com/Aerendir/bundle-features/workflows/PHP%20CS%20Fixer/badge.svg)](https://github.com/Aerendir/bundle-features/actions?query=branch%3Adev)\n[![Rector](https://github.com/Aerendir/bundle-features/workflows/Rector/badge.svg)](https://github.com/Aerendir/bundle-features/actions?query=branch%3Adev)\n\n## Features\n\nSerendipity HQ Features Bundle gives you the ability to configure the features you need to manage, give them a price if they are premium ones, create invoices for them and save subscriptions and configurations associated to your entities to give each of your users only the features they have to get.\n\n\u003chr /\u003e\n\u003ch3 align=\"center\"\u003e\n    \u003cb\u003eDo you like this bundle?\u003c/b\u003e\u003cbr /\u003e\n    \u003cb\u003e\u003ca href=\"#js-repo-pjax-container\"\u003eLEAVE A \u0026#9733;\u003c/a\u003e\u003c/b\u003e\n\u003c/h3\u003e\n\u003cp align=\"center\"\u003e\n    or run\u003cbr /\u003e\n    \u003ccode\u003ecomposer global require symfony/thanks \u0026\u0026 composer thanks\u003c/code\u003e\u003cbr /\u003e\n    to say thank you to all libraries you use in your current project, this included!\n\u003c/p\u003e\n\u003chr /\u003e\n\n## Basic usage\n\nSerendipityHQ Features Bundle divides the features in three macro-categories:\n\n- Boolean features: are features or configurations that can be switched on or off. For example, \"send an e-mail on [event_name]\".\n- Countable Features: are features that can be increased or decreased in number. For example, the number of users that can be added.\n- Rechargeable Features: Are features of which it is possible to run out. For example, \"You have X invites left\".\n\nThese are the three main categories in which all kind of features or configurations can fall in (if you find other macro categories, feel free to suggest them in the issues!).\n\nThese features can be configured in your configuration file and then can be managed through your app to make it able to do some things or not to do things.\n\nFeatures are grouped in sets, this way you can better manage your features without going crazy and without be confused.\n\nFor example, lets say you are building a project management app, you may want to have a set of features for the profile of each user and a set of features specific for projects.\n\nGrouping features in sets you can manage them in an easier way.\n\nThose are the very base concepts to understand and are the core of the internal working of the Serendipity HQ Features Bundle.\n\nRead more in the documentation to better understand how all this work toward your feature management in your app.\n\n## Install Serendipity HQ Features Bundle via Composer\n\n    $ composer require serendipity_hq/bundle-features\n\nThis library follows the http://semver.org/ versioning conventions.\n\n## Documentation\n\nYou can read how to install, configure, test and use the SerendipityHQ Features Bundle in the [documentation](docs/Index.md).\n\nInspiration for future features\n\n- https://github.com/yannickl88/features-bundle\n- https://github.com/DZunke/FeatureFlagsBundle\n\nSome other information\n\n- http://stackoverflow.com/questions/7707383/what-is-a-feature-flag\n\n\u003chr /\u003e\n\u003ch3 align=\"center\"\u003e\n    \u003cb\u003eDo you like this bundle?\u003c/b\u003e\u003cbr /\u003e\n    \u003cb\u003e\u003ca href=\"#js-repo-pjax-container\"\u003eLEAVE A \u0026#9733;\u003c/a\u003e\u003c/b\u003e\n\u003c/h3\u003e\n\u003cp align=\"center\"\u003e\n    or run\u003cbr /\u003e\n    \u003ccode\u003ecomposer global require symfony/thanks \u0026\u0026 composer thanks\u003c/code\u003e\u003cbr /\u003e\n    to say thank you to all libraries you use in your current project, this included!\n\u003c/p\u003e\n\u003chr /\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faerendir%2Fbundle-features","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faerendir%2Fbundle-features","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faerendir%2Fbundle-features/lists"}