Running Symfony CMF with Midgard2

I've written about Decoupled Content Management before. As the Symfony Live event in Paris is nearing, I thought to give Symfony CMF a spin. Symfony CMF is a new approach at building PHP content management systems, and adheres quite well to the principles of decoupled CMS:

I'm especially happy with the front-end editor, which has been implemented by Liip as part of their IKS Early Adopter project.

Most developers working on Symfony CMF have focused on using the Apache Jackrabbit PHPCR backend, but as you'll see in this tutorial, it works just fine also using the Midgard2 PHPCR provider. The advantage of using Midgard2 is a simpler stack, as you don't need any external Java processes and all data access happens with typical RDBMSs like MySQL and Postgres using a simple PHP extension.

Being able to run the same CMS with two completely different content repository back-ends is truly a sign of proper decoupling.

Getting started

First of all you need a Symfony2 application that uses the Symfony CMF bundles. Since not many of these are around yet, the best way to start is by installing the CMF Sandbox demo.

You can get this with a Git checkout:

$ git clone


To use Symfony CMF with Midgard2, you obviously need the PHP extension installed. Midgard2 is available in new Ubuntu and Debian releases, and so most likely the installation is as simple as:

$ sudo apt-get install php5-midgard2

For those on Mac OS X, the Midgard2 extension is also available on MacPorts.

The Midgard2 PHPCR provider also uses some necessary content schemas. Grab these two files:

and place them in /usr/share/midgard2/schema.

Configuring Symfony CMF to use Midgard2

Copy the app/config/parameters.yml.dist file to app/config/parameters.yml and edit it. Depending on what database you're using with Midgard2, the configuration could look something like:

    locale: en

    secret: xxxxxxxxxx

        type: midgard2
        db_type: SQLite
        db_name: cmf
        db_dir: /tmp
        db_init: true
        blobdir: /tmp/cmf-blobs
        loglevel: warn
    phpcr_workspace: default
    phpcr_user: admin
    phpcr_pass: password

With a MySQL database, the db_* parameters would be something like:

        type: midgard2
        db_type: MySQL
        db_name: midgard2
        db_username: root
        db_password: password

Installing with Composer

All PHP-level dependencies of Symfony CMF are installed with Composer. Download it with:

$ cd cmf-sandbox
$ wget

Jackrabbit is the default PHPCR implementation in Symfony CMF. To get Midgard2 PHPCR provider also installed, run your Composer installation with:

$ php composer.phar update --dev

Preparing the database

Symfony CMF requires some additional PHPCR data to be loaded. Handle that with:

$ app/console doctrine:phpcr:register-system-node-types

Then you can load some initial content to your Sandbox site:

$ app/console -v doctrine:phpcr:fixtures:load

Now your Midgard2 CMF database is ready! Edit your app/config/parameters.yml and change the dbinit parameter to false. This is important because otherwise Midgard2 perform a number of database structure checks every time it is loaded.

Using Symfony CMF

Once all of this is done and you have a working Symfony2 server setup (I'm running it with nginx), you should be ready to start using the CMF.

The site can be found under the /app_dev.php/ path of your server, so for example on my system it is in http://cmf.lo/app_dev.php/en.

Editing content in Symfony CMF

Read more Decoupled CMS posts.