[Experimental] Language for traversing and performing actions on your model
PHP
Latest commit 8d87c7d Aug 19, 2013 @mnapoli Readme
Permalink
Failed to load latest commit information.
doc
src/MetaModel
tests Added support for selecting all instances of a class Jul 23, 2013
.gitattributes
.gitignore
.travis.yml Coveralls integration Jul 18, 2013
README.md Readme Aug 19, 2013
composer.json Tabs to spaces Aug 19, 2013
phpunit.xml

README.md

MetaModel

Meta is a DSL that enables to represent, traverse and operate on PHP objects.

Build Status Coverage Status

Syntax

  • Get a specific object by its ID:
Article(1)

MetaModel integrates with Doctrine, but can be connected to anything.

  • Get all objects of a type
Article(*)
  • Object graph traversing (get all the articles of a category):
Category(1).articles
  • Call methods:
// Will call generateExtract() on all articles
Article(*).generateExtract()
  • Field filtering (not implemented yet):
Article[author="bob"]

Operators:

UserGroup[ users.contains(User(1)) ]
UserGroup[ users.count() > 0 ]
  • Service:
CacheService.flush()

MetaModel integrates with containers, registries, anything…

Integration

MetaModel finds objects in data sources. You can add any data source by implementing the simple interfaces: ObjectManager or Container.

Some libraries are already supported natively:

  • Doctrine's Entity Manager: MetaModel\Bridge\Doctrine\EntityManagerBridge

    $metaModel = new MetaModel();
    $metaModel->addObjectManager(new EntityManagerBridge($entityManager));
  • PHP-DI container: MetaModel\Bridge\PHPDI\PHPDIBridge

    $metaModel = new MetaModel();
    $metaModel->addContainer(new PHPDIBridge($container));

Add your own by submitting a pull request.

Usages

Those are both ideas and work in progress.

Instead of using phpMyAdmin, or building an admin interface, you can manipulate the DB with high level object queries.

  • Advanced replacement for PropertyAccess, e.g. to build forms, templates (Twig?)

  • Simplified object queries (from database)

  • Paths for anything meta on your model: logs, AOP, ACL (e.g. "User(1) can edit Category(12).articles")

Projects using MetaModel: