Ultra lightweight CMS based on top of Silex

0.2.7 2014-01-31 08:52 UTC

This package is not auto-updated.

Last update: 2022-01-08 01:25:24 UTC



This project aims to provide a minimal toolset helping to create corporate websites. Using Silex as primary framework, it includes multiple shorthand classes.




We use SilexCMS for our coroporate website. You could see it live at wisembly.com and have a look to github.com/wisembly/wisembly



There is two kind of web pages : statics and dynamics.

Static pages does not rely on anything else than their templates. Dynamic ones take parameters in their urls, fetch a table, then render the specified template, storing the resulting objects in an accessible variable.

Static Page

$app->register(new SilexCMS\Page\StaticPage('/', 'home.html.twig'));

Dynamic Page

$app->register(new SilexCMS\Page\DynamicPage('/product/{slug}', 'product.html.twig'));
{% if app.set not none %}
    Our product is called {{ app.set.name }} :)
{% else %}
    Product not found :(
{% endif %}


Datasets are an easy and handy way to retrieve database data directly in your Twig templates. First, register your available DataSets for your application:

$app->register(new DataSet('twig_name', 'table_name'));
$app->register(new DataSet('users', 'user'));

Then, use them in your Twig templates:

{# Tell in your template that you will need users DataSet loaded in app #}
{% bloc users %}{% endbloc %}

{# Then use it freely in your template in app var #}
First user name: {{ app.users[0].name }}

Users emails:
{% for user in app.users %}
  email: {{ user.email }}
{% endfor %}


KeyValueSets are an easy and handy way to retrieve from your database key => values sets in your Twig templates. They work like DataSets above, but allows to access values differently in your templates.

$app->register(new DataSet('twig_name', 'table_name', 'key_name'));
$app->register(new DataSet('messages', 'messages', 'key'));

For the following set:

| key | value |
| foo | bar   |
| bar | baz   |

In your template you could then use:

{% bloc messages %}{% endbloc %}

{# will output "bar" #}
foo value is: {{ app.messages.foo }}

Foreign Twig extension

SilexCMS provides a Twig Extension to retrieve easily a particular object by id reference inside a DataSet

First, load Foreign Key Extension

$app['twig']->addExtension(new \SilexCMS\Twig\Extension\ForeignKeyExtension($app));

Then, use it that way in your Twig Templates:

{% block books %}{% endblock %}
{% block categories %}{% endblock %}
{% set category = foreign(app.categories, app.books[0].category_id) %}
The 1rst book category is: {{ category.name }}


The security classes give a very simple way to identifying some users.

When instanciating a Firewall, you will only have to provide a name and an array containing your users authentification infos (where the key will be their usernames and values are plain text passwords). A logger instance will be automagically created in the app[name] variable.

From then, you can use this logger to check current user state or change it.

Manual example

$app->register(new SilexCMS\Security\Firewall('main', array('user' => 'pass')));

var_dump($app['main']->getUsername()); // null
var_dump($app['main']->getUsername()); // "user"

Request example

You can also bind requests if they have at least two parameters : _username and _password.

$app->register(new SilexCMS\Security\Firewall('security', array('user' => 'pass')));

$app->register(new SilexCMS\Page\StaticPage('/login', 'login.html.twig'));
$app->register(new SilexCMS\Page\StaticPage('/login/success', 'login/success.html.twig'));
$app->register(new SilexCMS\Page\StaticPage('/login/failure', 'login/failure.html.twig'));

$app->post('/post', function (Application $app, Request $req) {
    $security = $app['security'];

    if ($security->bindSession()->getUserName() || $security->bindRequest($req)->getUserName()) {
        return $app->redirect('login/success');
    } else {
        return $app->redirect('login/failure');
<form action="/login" method="post">
    <input type="text" name="_password" /><br />
    <input type="password" name="_password" /><br />
    <input type="submit" />


SilexCMS is licensed under the MIT license.