I am a passionate open-source developer. On this page you can learn more about the projects I am participating in.


Symfony is a high-quality PHP framework for enterprises. If you need a PHP framework that is mature, stable, performant, has a predictable release cycle and is flexible to be used in projects from medium to very large sizes, Symfony is your first choice.

I have been part of the Symfony core team since 2009, when I took charge of various Symfony components, like the powerful Form and Validator components.


Puli is a PHP toolkit that integrates your Composer packages into your application. Puli's goal is to unify the PHP community by replacing the "bundle", "module" and "plugin" concepts of different frameworks and platforms by one universal solution.

I founded the project in the fall of 2014. The first stable release of Puli is expected for late 2015. Follow @PuliPHP on Twitter to receive all the latest news.


Console is a library for developing CLI applications in PHP. The library is an evolution of the Symfony Console component that drastically improves its design and testability. Its key features are:

  • Support for dependency injection
  • Easily unit testable
  • Supports nested commands like git remote add
  • Beautiful output by default
  • Supports Symfony Console code through adapter classes

Among others, the package builds the foundation of the Puli CLI.

Read the Console Documentation to learn more.

Key-Value Store

The Key-Value Store library provides a common interface for different key-value store implementations. If you want to use a key-value store in your project without committing to one specific implementation, use this interface instead.

public function getConfigKey(KeyValueStore $store, $key)
    return $store->get('config/'.$key);

Read the Key-Value Store Documentation to learn more.


The Expression library lets you build and evaluate expressions in PHP. This is useful if you want to filter and match objects by dynamic criteria. Contrary to PHP closures, Expressions can be transformed to SQL/DQL or other kinds of queries to a database backend.

$expr = Expr::method('getName', Expr::equals('John'))
    ->orMethod('getAge', Expr::lessThan(40));

$persons = $repository->find($expr);

Read the Expression Documentation to learn more.


JSON is a robust library that normalizes the behavior of json_encode() and json_decode() across different PHP versions and throws proper exceptions when errors occur. In addition, the library supports automatic validation of your JSON against a JSON Schema to check whether its structure is correct.

$decoder = new JsonDecoder();

try {
    $data = $decoder->decodeFile('/path/to/file.json', '/path/to/schema.json');
} catch (ValidationFailedException $e) {
    // data did not match schema

Read the JSON Documentation to learn more.

Path Utility

The Path Utility provides cross-platform functions for normalizing, analyzing and modifying file paths. If you need to deal with file paths in your project, this package will greatly simplify their use.

echo Path::canonicalize('/var/www/vhost/webmozart/../config.ini');
// => /var/www/vhost/config.ini

echo Path::makeAbsolute('config/config.yml', '/var/www/project');
// => /var/www/project/config/config.yml

echo Path::makeRelative('/var/www/project/config/config.yml', '/var/www/project/uploads');
// => ../config/config.yml

Check the API Documentation to learn more about the methods supported by the Path class.


The Glob library implements Ant globs in PHP. These globs support the pattern /**/ for matching any number of directories. Additionally, the Glob class supports methods for matching globs against paths, inspecting glob patterns and more.

foreach (Glob::glob('/home/webmozart/**/*.{jpg,png}' as $path) {
    // do something...

Refer to the API Documentation for more information about the Glob class.


If you can't use PHP 7 with its scalar type hint support, you need to perform plenty of input validation in your methods. The Assert library reduces input validation to a single line of code. Contrary to Benjamin Eberlei's famous beberlei/assert package, this library makes writing exception messages easy and consistent:

function login($username, $password, $rememberMe) {
    Assert::stringNotEmpty($username, 'The username must be a non-empty string. Got: %s');
    Assert::stringNotEmpty($password, 'The password must be a non-empty string. Got: %s');
    Assert::boolean($rememberMe, 'The remember-me flag should be a boolean. Got: %s');

    // log in...

Refer to the API Documentation for more information about the Assert class.