PHPackages                             asika/object-metadata - 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. asika/object-metadata

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

asika/object-metadata
=====================

PHP Global Object Metadata Management

1.0(2y ago)07.1k↓33.3%3MITPHPPHP &gt;=8.0

Since Jan 23Pushed 2y ago1 watchersCompare

[ Source](https://github.com/asika32764/php-object-metadata)[ Packagist](https://packagist.org/packages/asika/object-metadata)[ RSS](/packages/asika-object-metadata/feed)WikiDiscussions main Synced 1mo ago

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

PHP Object Metadata
===================

[](#php-object-metadata)

 [![GitHub](https://camo.githubusercontent.com/d7ee28c8a0a0b7cbc7cbcc8701840014269e1d0035ac647cd81a4074c63418f6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6173696b6133323736342f7068702d6f626a6563742d6d657461646174613f7374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/d7ee28c8a0a0b7cbc7cbcc8701840014269e1d0035ac647cd81a4074c63418f6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6173696b6133323736342f7068702d6f626a6563742d6d657461646174613f7374796c653d666c61742d737175617265) [![GitHub Workflow Status](https://camo.githubusercontent.com/ac16fc0618986795458b45f72f9f335189cf419e1ef0e5fe18fd8a0293eaa5be/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6173696b6133323736342f7068702d6f626a6563742d6d657461646174612f746573742e796d6c3f6c6162656c3d74657374267374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/ac16fc0618986795458b45f72f9f335189cf419e1ef0e5fe18fd8a0293eaa5be/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6173696b6133323736342f7068702d6f626a6563742d6d657461646174612f746573742e796d6c3f6c6162656c3d74657374267374796c653d666c61742d737175617265) [![Packagist Downloads](https://camo.githubusercontent.com/da94b056b812c6bbd86d300771cdd29d0b56a36a137e33d4ab3d02522c3fc10a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6173696b612f6f626a6563742d6d657461646174613f7374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/da94b056b812c6bbd86d300771cdd29d0b56a36a137e33d4ab3d02522c3fc10a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6173696b612f6f626a6563742d6d657461646174613f7374796c653d666c61742d737175617265) [ ![Packagist Version](https://camo.githubusercontent.com/3e6ca1c7645100c4070e4a480a8401c3177ef4992735ddf830e4a5fcf9bb0f2a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6173696b612f6f626a6563742d6d657461646174613f7374796c653d666c61742d737175617265) ](https://packagist.org/packages/asika/object-metadata)

`Object Metadata` is a package to help developer manage custom global object metadata. This package use `WeakMap` to control the data mapping with object instances.

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

[](#installation)

```
composer require asika/object-metadata
```

Getting Started
---------------

[](#getting-started)

Basic usage:

```
use Asika\ObjectMetadata\ObjectMetadata;

// Create any objects
$obj = new ArticleEntity();

// Get global main instance
$meta = ObjectMetadata::getInstance();

// Set custom metadata
$meta->set($obj, 'foo', 'Hello');

// Now you can get the data everywhere if this object still exists and not destruct yet
ObjectMetadata::getInstance()->get($obj, 'foo'); // Hello

// Available methods
$meta->get($obj, 'key');
$meta->set($obj, 'key', 'value');
$meta->has($obj, 'key');
$meta->remove($obj, 'key');
$meta->getMetadata($obj, 'key'); // array
$meta->setMetadata($obj, 'key', $data);
```

Use wrapper:

```
$obj = new ArticleEntity();
$meta = ObjectMetadata::getInstance();

$metaWrapper = $meta->wrapper($obj);
$metaWrapper->set('foo', 'Hello');

$metaWrapper->get('key');
$metaWrapper->has('key');
$metaWrapper->remove('key');
$metaWrapper->all();

// Array Access
$metaWrapper['key'] = 'value';

// If object destructed, getting metadata will be NULL
unset($obj);

$metaWrapper->get('foo'); // NULL
```

Scope
-----

[](#scope)

The `ObjectMetadata` is able to separate different scopes.

```
$meta = ObjectMetadata::getInstance('main'); // Main scope

$appMeta = ObjectMetadata::getInstance('app');

$dbMeta = ObjectMetadata::getInstance('db');
```

What is The Real Usage
----------------------

[](#what-is-the-real-usage)

The useful case for this package is that we can make some entity object or value object to be a rich object. for example, if a ORM uses data-mapper pattern, their entity object will be a anemic object which may not keep the ORM instance.

```
$item = new Article();

$item = $orm->createOne($item);

// This item will only contains pure data
```

If the ORM use this package to make themselves as entity metadata, we can make the `Article` entity as a rich object and has the capacity to all ORM to get another objects.

```
$orm->on('entity.prepare', function (object $entity, ORM $orm) {
    ObjectMetadata::getInstance('db')->set($entity, 'orm', $orm);
});

class Article
{
    // ...

    // Article can use ObjectMetadata to get ORM instance.
    public function getComments() {
        $orm = ObjectMetadata::getInstance('db')->get($this, 'orm');

        return $orm->from(Comment::class)
            ->where('article_id', $this->getId())
            ->all();
    }
}

// Now we can test it
$article = $orm->createEntity(Article::class);

$item = $orm->createOne($item);

// Article is able to call ORM to get another items from DB
$item->getComments();
$item->getAuthor();
$item->getTags();
```

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity23

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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

Unknown

Total

1

Last Release

846d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1639206?v=4)[Simon Asika](/maintainers/asika32764)[@asika32764](https://github.com/asika32764)

---

Top Contributors

[![asika32764](https://avatars.githubusercontent.com/u/1639206?v=4)](https://github.com/asika32764 "asika32764 (4 commits)")

---

Tags

datamapperddddomain-driven-designmetadataobject-metadatarich-domain-model

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/asika-object-metadata/health.svg)

```
[![Health](https://phpackages.com/badges/asika-object-metadata/health.svg)](https://phpackages.com/packages/asika-object-metadata)
```

###  Alternatives

[nayjest/str-case-converter

Library for converting strings from camel case to snake case and vice versa.

12484.6k14](/packages/nayjest-str-case-converter)

PHPackages © 2026

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