{"id":17124625,"url":"https://github.com/asika32764/php-object-metadata","last_synced_at":"2025-03-24T03:27:29.516Z","repository":{"id":218669582,"uuid":"747038443","full_name":"asika32764/php-object-metadata","owner":"asika32764","description":"PHP Global Object Metadata Management Package, to implement rich domain model.","archived":false,"fork":false,"pushed_at":"2024-01-23T07:27:32.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-06-25T10:55:38.935Z","etag":null,"topics":["datamapper","ddd","domain-driven-design","metadata","object-metadata","rich-domain-model"],"latest_commit_sha":null,"homepage":"https://packagist.org/packages/asika/object-metadata","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/asika32764.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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":"2024-01-23T06:17:00.000Z","updated_at":"2024-06-16T19:10:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"b6e45db9-b161-466e-b2f9-b8a7680df349","html_url":"https://github.com/asika32764/php-object-metadata","commit_stats":null,"previous_names":["asika32764/php-object-metadata"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asika32764%2Fphp-object-metadata","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asika32764%2Fphp-object-metadata/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asika32764%2Fphp-object-metadata/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asika32764%2Fphp-object-metadata/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asika32764","download_url":"https://codeload.github.com/asika32764/php-object-metadata/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245203472,"owners_count":20577160,"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":["datamapper","ddd","domain-driven-design","metadata","object-metadata","rich-domain-model"],"created_at":"2024-10-14T18:43:02.287Z","updated_at":"2025-03-24T03:27:29.475Z","avatar_url":"https://github.com/asika32764.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PHP Object Metadata\n\n\u003cp\u003e\n    \u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/asika32764/php-object-metadata?style=flat-square\"\u003e\n    \u003cimg alt=\"GitHub Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/asika32764/php-object-metadata/test.yml?label=test\u0026style=flat-square\"\u003e\n    \u003cimg alt=\"Packagist Downloads\" src=\"https://img.shields.io/packagist/dt/asika/object-metadata?style=flat-square\"\u003e\n    \u003ca href=\"https://packagist.org/packages/asika/object-metadata\"\u003e\n        \u003cimg alt=\"Packagist Version\" src=\"https://img.shields.io/packagist/v/asika/object-metadata?style=flat-square\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n`Object Metadata` is a package to help developer manage custom global object metadata.\nThis package use `WeakMap` to control the data mapping with object instances.\n\n## Installation\n\n```shell\ncomposer require asika/object-metadata\n```\n\n## Getting Started\n\nBasic usage:\n\n```php\nuse Asika\\ObjectMetadata\\ObjectMetadata;\n\n// Create any objects\n$obj = new ArticleEntity();\n\n// Get global main instance\n$meta = ObjectMetadata::getInstance();\n\n// Set custom metadata\n$meta-\u003eset($obj, 'foo', 'Hello');\n\n// Now you can get the data everywhere if this object still exists and not destruct yet\nObjectMetadata::getInstance()-\u003eget($obj, 'foo'); // Hello\n\n// Available methods\n$meta-\u003eget($obj, 'key');\n$meta-\u003eset($obj, 'key', 'value');\n$meta-\u003ehas($obj, 'key');\n$meta-\u003eremove($obj, 'key');\n$meta-\u003egetMetadata($obj, 'key'); // array\n$meta-\u003esetMetadata($obj, 'key', $data);\n\n```\n\nUse wrapper:\n\n```php\n$obj = new ArticleEntity();\n$meta = ObjectMetadata::getInstance();\n\n$metaWrapper = $meta-\u003ewrapper($obj);\n$metaWrapper-\u003eset('foo', 'Hello');\n\n$metaWrapper-\u003eget('key');\n$metaWrapper-\u003ehas('key');\n$metaWrapper-\u003eremove('key');\n$metaWrapper-\u003eall();\n\n// Array Access\n$metaWrapper['key'] = 'value';\n\n// If object destructed, getting metadata will be NULL\nunset($obj);\n\n$metaWrapper-\u003eget('foo'); // NULL\n```\n\n## Scope\n\nThe `ObjectMetadata` is able to separate different scopes.\n\n```php\n$meta = ObjectMetadata::getInstance('main'); // Main scope\n\n$appMeta = ObjectMetadata::getInstance('app');\n\n$dbMeta = ObjectMetadata::getInstance('db');\n```\n\n## What is The Real Usage\n\nThe useful case for this package is that we can make some entity object or value object to be a\nrich object. for example, if a ORM uses data-mapper pattern, their entity object will be a anemic object\nwhich may not keep the ORM instance.\n\n```php\n$item = new Article();\n\n$item = $orm-\u003ecreateOne($item);\n\n// This item will only contains pure data\n```\n\nIf the ORM use this package to make themselves as entity metadata, we can make the `Article` entity as a\nrich object and has the capacity to all ORM to get another objects.\n\n```php\n$orm-\u003eon('entity.prepare', function (object $entity, ORM $orm) {\n    ObjectMetadata::getInstance('db')-\u003eset($entity, 'orm', $orm);\n});\n\nclass Article \n{\n    // ...\n\n    // Article can use ObjectMetadata to get ORM instance.\n    public function getComments() {\n        $orm = ObjectMetadata::getInstance('db')-\u003eget($this, 'orm');\n        \n        return $orm-\u003efrom(Comment::class)\n            -\u003ewhere('article_id', $this-\u003egetId())\n            -\u003eall();\n    }\n}\n\n// Now we can test it\n$article = $orm-\u003ecreateEntity(Article::class);\n\n$item = $orm-\u003ecreateOne($item);\n\n// Article is able to call ORM to get another items from DB\n$item-\u003egetComments();\n$item-\u003egetAuthor();\n$item-\u003egetTags();\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasika32764%2Fphp-object-metadata","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasika32764%2Fphp-object-metadata","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasika32764%2Fphp-object-metadata/lists"}