SlideShare a Scribd company logo
Silex: From nothing, to an API




Sunday, 21 April 13
About me


                                  I'm Chris Kemper

             I work at Drummond Central, but I also freelance

                      I've been in the industry for around 5 years

       I've written a book with a snake on the cover (It's on
                 Version Control, if you didn't know)

                               I also own an elePHPant


Sunday, 21 April 13
About me

                                 Pies




                          Cows

Sunday, 21 April 13
What is Silex?




                       "Silex is a PHP microframework for PHP 5.3. It is built on the
                      shoulders of Symfony2 and Pimple and also inspired by sinatra."


                              Created by Fabien Potencier and Igor Wiedler




Sunday, 21 April 13
Getting started

                           You can download it from the site directly
                                   http://silex.sensiolabs.org/


                         Or, you can get with the times and use Composer




                                   {
                                     "require": {
                                       "silex/silex": "1.0.*@dev"
                                   ! }
                                   }




Sunday, 21 April 13
Your first end point

                      I’ve used Composer, so after it’s all installed, you can add the first end
                                                       point!




         require_once __DIR__.'/../vendor/autoload.php';

         $app = new SilexApplication();

         $app->get('/hello/{name}', function($name) use($app) {
             !return 'Hello '.$app->escape($name);
         });

         $app->run();




Sunday, 21 April 13
Don’t forget about .htaccess

                      Composer doesn’t pull it down, do don’t forget to put it in.


         <IfModule mod_rewrite.c>
             Options -MultiViews

             RewriteEngine On
             #RewriteBase /path/to/app
             RewriteCond %{REQUEST_FILENAME} !-f
             RewriteRule ^ index.php [L]
         </IfModule>


                           If you’re using Apache 2.2.16+, then you can use:




         FallbackResource /index.php




Sunday, 21 April 13
nginx works too!

         server {
             location = / {
                  try_files @site @site;
             }

                      location / {
                          try_files $uri $uri/ @site;
                      }

                      location ~ .php$ {
                          return 404;
                      }

                      location @site {
                          fastcgi_pass   unix:/var/run/php-fpm/www.sock;
                          include fastcgi_params;
                          fastcgi_param SCRIPT_FILENAME $document_root/index.php;
                          #fastcgi_param HTTPS on;
                      }
         }

Sunday, 21 April 13
Using a templating language

                      You don’t always want to output strings, so let’s use Twig, because it’s
                                                  awesome.




                                        {
                                            "require": {
                                              "silex/silex": "1.0.*@dev",
                                              "twig/twig": ">=1.8,<2.0-dev",
                                              "symfony/twig-bridge": "~2.1"
                                            }
                                        }




Sunday, 21 April 13
Register the Twig Service provider

         $app->register(new SilexProviderTwigServiceProvider(), array(
         !    'twig.path' => __DIR__.'/views',
         ));



                                   Now to use it




         $app->get('/hello/{name}', function ($name) use ($app) {
             !return $app['twig']->render('hello.twig', array(
             !    'name' => $name,
              ));
         });




Sunday, 21 April 13
So many more Service providers




                             Check the docs at http://silex.sensiolabs.org/documentation

                 There are a boat load of Built-in Service Providers which you can take advantage of!

                       Doctrine, Monolog, Form and Validation are just a couple of examples.




Sunday, 21 April 13
Tips: Extending the base application

  This allows you to add, anything to the base application to
                  make your own life easier.

                                 First of all, you need a class


         <?php
         namespace Acme;

         use
                      SilexApplication as BaseApplication;

         class Application extends BaseApplication {

         }


Sunday, 21 April 13
Tips: Extending the base application

                      Now time to autoload that class, psr-0 style.


                                  {
                                      "require": {
                                          "silex/silex": "1.0.*@dev",
                                          "twig/twig": ">=1.8,<2.0-dev",
                                          "symfony/twig-bridge": "~2.1"!
                                      },
                                      "autoload": {
                                          "psr-0": {"Acme": "src/"}
                                      }
                                  }




Sunday, 21 April 13
Tips: Separate your config and routes

   app/bootstrap.php
                      require_once __DIR__ . '/../vendor/autoload.php';

                      use
                      !   SymfonyComponentHttpFoundationRequest,
                      !   SymfonyComponentHttpFoundationResponse;

                      use
                      !   AcmeApplication;

                      $app = new Application;

                      $app->register(new SilexProviderTwigServiceProvider(),
                      array(
                      !   'twig.path' => __DIR__.'/views',
                      ));

                      return $app;


Sunday, 21 April 13
Tips: Separate your config and routes

   web/index.php




                      <?php

                      $app = include __DIR__ . '/../app/bootstrap.php';

                      $app->get('/hello/{name}', function ($name) use ($app) {
                          return $app['twig']->render('hello.twig', array(
                              'name' => $name,
                          ));
                      });

                      $app->run();




Sunday, 21 April 13
Let's make an API



        Silex is great for API's, so let's make one. Here is the groundwork for a basic
                                           user-based API

     Some lovely endpoints:

     Create a user (/user) - This will use POST to create a new user in the DB.
     Update a user (/user/{id}) - This will use PUT to update the user
     View a user (/user/{id}) - This will use GET to view the users information
     Delete a user (/user/{id}) - Yes you guessed it, this uses the DELETE method.




Sunday, 21 April 13
More dependencies!

              If we want to use a database, we'll need to define one. Let's get DBAL!



                                   {
                                       "require": {
                                           "silex/silex": "1.0.*@dev",
                                           "twig/twig": ">=1.8,<2.0-dev",
                                           "symfony/twig-bridge": "~2.1",
                                           "doctrine/dbal": "2.2.*"
                                       },
                                       "autoload": {
                                           "psr-0": {"Acme": "src/"}
                                       }
                                   }




Sunday, 21 April 13
More dependencies!

                       It'll just be MySQL so let's configure that




         $app->register(new DoctrineServiceProvider(), array(
         !    'db.options' => array(
         !    ! 'dbname' ! => 'acme',
         !    ! 'user' ! ! => 'root',
         !    ! 'password' ! => 'root',
         !    ! 'host' ! ! => 'localhost',
         !    ! 'driver' ! => 'pdo_mysql',
         !    ),
         ));




Sunday, 21 April 13
Show me your endpoints: POST

                      Before we can do anything, we need to create some users.



         $app->post('/user', function (Request $request) use ($app) {
           $user = array(
               'email' => $request->get('email'),
         !     'name' => $request->get('name')
           );

              $app['db']->insert('user', $user);

           return new Response("User " . $app['db']->lastInsertId() . "
           created", 201);
         });




Sunday, 21 April 13
Show me your endpoints: PUT

                          To update the users, we need to use PUT



         $app->put('/user/{id}', function (Request $request, $id) use
         ($app) {
           $sql = "UPDATE user SET email = ?, name = ? WHERE id = ?";

              $app['db']->executeUpdate($sql, array(
                $request->get('email'),
                $request->get('name'),
                 (int) $id)
              );
         !
           return new Response("User " . $id . " updated", 303);
         });




Sunday, 21 April 13
Show me your endpoints: GET

                            Let's get the API to output the user data as JSON




         $app->get('/user/{id}', function (Request $request, $id) use
         ($app) {
             $sql = "SELECT * FROM user WHERE id = ?";
             $post = $app['db']->fetchAssoc($sql, array((int) $id));

                      return $app->json($post, 201);
         });




Sunday, 21 April 13
Show me your endpoints: DELETE

                                       Lastly, we have DELETE




         $app->delete('/user/{id}', function (Request $request, $id) use
         ($app) {
             $sql = "DELETE FROM user WHERE id = ?";
             $app['db']->executeUpdate($sql, array((int) $id));

                      return new Response("User " . $id . " deleted", 303);
         });




Sunday, 21 April 13
A note about match()

                      Using match, you can catch any method used on a route. Like so:

         $app->match('/user', function () use ($app) {
         !    ...
         });



             You can also limit the method accepted by match by using the 'method'
                                            method

         $app->match('/user', function () use ($app) {
         !    ...
         })->method('PUT|POST');




Sunday, 21 April 13
Using before() and after()

        Each request, can be pre, or post processed. In this case, it could be used for
                                            auth.


         $before = function (Request $request) use ($app) {
             ...
         };

         $after = function (Request $request) use ($app) {
             ...
         };

         $app->match('/user', function () use ($app) {
             ...
         })
         ->before($before)
         ->after($after);




Sunday, 21 April 13
Using before() and after()

                            This can also be used globally, like so:

         $app->before(function(Request $request) use ($app) {
             ...
         });



         You can also make an event be as early as possible, or as late as possible by
           using Application::EARLY_EVENT and Application::LATE_EVENT, respectively.


         $app->before(function(Request $request) use ($app) {
             ...
         }, Application::EARLY_EVENT);




Sunday, 21 April 13
Time for a demo




Sunday, 21 April 13
Summary


              This is just a small amount of what Silex is capable
                                   of, try it out.

                                  Thank You!

                          http://silex.sensiolabs.org/
                               @chrisdkemper
                          http://chrisdkemper.co.uk




Sunday, 21 April 13

More Related Content

PDF
Complex Sites with Silex
PDF
Silex and Twig (PHP Dorset talk)
PDF
Keeping it Small: Getting to know the Slim Micro Framework
PDF
Silex Cheat Sheet
PDF
Keeping it small - Getting to know the Slim PHP micro framework
PDF
Building Modern and Secure PHP Applications – Codementor Office Hours with Be...
KEY
And the Greatest of These Is ... Rack Support
PDF
What happens in laravel 4 bootstraping
Complex Sites with Silex
Silex and Twig (PHP Dorset talk)
Keeping it Small: Getting to know the Slim Micro Framework
Silex Cheat Sheet
Keeping it small - Getting to know the Slim PHP micro framework
Building Modern and Secure PHP Applications – Codementor Office Hours with Be...
And the Greatest of These Is ... Rack Support
What happens in laravel 4 bootstraping

What's hot (19)

PDF
Phinx talk
PPT
Building Single Page Application (SPA) with Symfony2 and AngularJS
PPT
Slim RedBeanPHP and Knockout
PDF
Head First Zend Framework - Part 1 Project & Application
PPTX
Zend framework
PDF
Avinash Kundaliya: Javascript and WordPress
PPTX
Using WordPress as your application stack
PDF
Codeigniter : Two Step View - Concept Implementation
PDF
The Enterprise Wor/d/thy/Press
PPT
Symfony2 and AngularJS
PDF
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
PDF
深入淺出 MVC
PDF
WordPress REST API hacking
PPTX
New in php 7
PDF
Bootstrat REST APIs with Laravel 5
PDF
The Enterprise Wor/d/thy/Press
PDF
WordPress REST API hacking
PPTX
21.search in laravel
PDF
Como construir uma Aplicação que consuma e produza updates no Twitter usando ...
Phinx talk
Building Single Page Application (SPA) with Symfony2 and AngularJS
Slim RedBeanPHP and Knockout
Head First Zend Framework - Part 1 Project & Application
Zend framework
Avinash Kundaliya: Javascript and WordPress
Using WordPress as your application stack
Codeigniter : Two Step View - Concept Implementation
The Enterprise Wor/d/thy/Press
Symfony2 and AngularJS
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
深入淺出 MVC
WordPress REST API hacking
New in php 7
Bootstrat REST APIs with Laravel 5
The Enterprise Wor/d/thy/Press
WordPress REST API hacking
21.search in laravel
Como construir uma Aplicação que consuma e produza updates no Twitter usando ...
Ad

Viewers also liked (17)

PDF
Silex meets SOAP & REST
PDF
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
PDF
Sales-Funnel-Slideshare
KEY
Silex 入門
PDF
Silex入門
PDF
Your marketing funnel is a hot mess
KEY
Silex, the microframework
PDF
Google drive for nonprofits webinar
PPT
&lt;iframe src="//www.slideshare.net/slideshow/embed_code/42392945" width="47...
PPT
Project performance tracking analysis and reporting
PPT
How to Embed a PowerPoint Presentation Using SlideShare
PDF
Optimize Your Sales & Marketing Funnel
PDF
Windows 10 UWP App Development ebook
PPTX
How To Embed SlideShare Shows Into WordPress.com
PDF
2015 Upload Campaigns Calendar - SlideShare
PPTX
What to Upload to SlideShare
PDF
Getting Started With SlideShare
Silex meets SOAP & REST
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Sales-Funnel-Slideshare
Silex 入門
Silex入門
Your marketing funnel is a hot mess
Silex, the microframework
Google drive for nonprofits webinar
&lt;iframe src="//www.slideshare.net/slideshow/embed_code/42392945" width="47...
Project performance tracking analysis and reporting
How to Embed a PowerPoint Presentation Using SlideShare
Optimize Your Sales & Marketing Funnel
Windows 10 UWP App Development ebook
How To Embed SlideShare Shows Into WordPress.com
2015 Upload Campaigns Calendar - SlideShare
What to Upload to SlideShare
Getting Started With SlideShare
Ad

Similar to Silex: From nothing to an API (20)

KEY
Rapid Prototyping FTW!!!
KEY
PDF
May The Nodejs Be With You
PPTX
PSGI and Plack from first principles
KEY
How and why i roll my own node.js framework
PDF
How we're building Wercker
PDF
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
PDF
Crossing the Bridge: Connecting Rails and your Front-end Framework
PDF
Building websites with Node.ACS
PDF
Building websites with Node.ACS
PDF
Elixir on Containers
PDF
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
PDF
Build Web Apps using Node.js
PDF
The Peanut Butter Cup of Web-dev: Plack and single page web apps
PPTX
Local SQLite Database with Node for beginners
PDF
Intro to Rack
PDF
Container (Docker) Orchestration Tools
PPTX
Let's play with adf 3.0
PDF
Puppet and AWS: Getting the best of both worlds
PDF
Cocoapods and Most common used library in Swift
Rapid Prototyping FTW!!!
May The Nodejs Be With You
PSGI and Plack from first principles
How and why i roll my own node.js framework
How we're building Wercker
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
Crossing the Bridge: Connecting Rails and your Front-end Framework
Building websites with Node.ACS
Building websites with Node.ACS
Elixir on Containers
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Build Web Apps using Node.js
The Peanut Butter Cup of Web-dev: Plack and single page web apps
Local SQLite Database with Node for beginners
Intro to Rack
Container (Docker) Orchestration Tools
Let's play with adf 3.0
Puppet and AWS: Getting the best of both worlds
Cocoapods and Most common used library in Swift

Recently uploaded (20)

PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Empathic Computing: Creating Shared Understanding
PDF
Electronic commerce courselecture one. Pdf
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
cuic standard and advanced reporting.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Tartificialntelligence_presentation.pptx
PPTX
A Presentation on Artificial Intelligence
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
Spectroscopy.pptx food analysis technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Machine learning based COVID-19 study performance prediction
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Machine Learning_overview_presentation.pptx
20250228 LYD VKU AI Blended-Learning.pptx
Empathic Computing: Creating Shared Understanding
Electronic commerce courselecture one. Pdf
gpt5_lecture_notes_comprehensive_20250812015547.pdf
cuic standard and advanced reporting.pdf
Big Data Technologies - Introduction.pptx
Dropbox Q2 2025 Financial Results & Investor Presentation
Group 1 Presentation -Planning and Decision Making .pptx
Spectral efficient network and resource selection model in 5G networks
Digital-Transformation-Roadmap-for-Companies.pptx
Tartificialntelligence_presentation.pptx
A Presentation on Artificial Intelligence
Advanced methodologies resolving dimensionality complications for autism neur...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Spectroscopy.pptx food analysis technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
Machine learning based COVID-19 study performance prediction
A comparative analysis of optical character recognition models for extracting...
Per capita expenditure prediction using model stacking based on satellite ima...
Machine Learning_overview_presentation.pptx

Silex: From nothing to an API

  • 1. Silex: From nothing, to an API Sunday, 21 April 13
  • 2. About me I'm Chris Kemper I work at Drummond Central, but I also freelance I've been in the industry for around 5 years I've written a book with a snake on the cover (It's on Version Control, if you didn't know) I also own an elePHPant Sunday, 21 April 13
  • 3. About me Pies Cows Sunday, 21 April 13
  • 4. What is Silex? "Silex is a PHP microframework for PHP 5.3. It is built on the shoulders of Symfony2 and Pimple and also inspired by sinatra." Created by Fabien Potencier and Igor Wiedler Sunday, 21 April 13
  • 5. Getting started You can download it from the site directly http://silex.sensiolabs.org/ Or, you can get with the times and use Composer { "require": { "silex/silex": "1.0.*@dev" ! } } Sunday, 21 April 13
  • 6. Your first end point I’ve used Composer, so after it’s all installed, you can add the first end point! require_once __DIR__.'/../vendor/autoload.php'; $app = new SilexApplication(); $app->get('/hello/{name}', function($name) use($app) { !return 'Hello '.$app->escape($name); }); $app->run(); Sunday, 21 April 13
  • 7. Don’t forget about .htaccess Composer doesn’t pull it down, do don’t forget to put it in. <IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On #RewriteBase /path/to/app RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule> If you’re using Apache 2.2.16+, then you can use: FallbackResource /index.php Sunday, 21 April 13
  • 8. nginx works too! server { location = / { try_files @site @site; } location / { try_files $uri $uri/ @site; } location ~ .php$ { return 404; } location @site { fastcgi_pass unix:/var/run/php-fpm/www.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; #fastcgi_param HTTPS on; } } Sunday, 21 April 13
  • 9. Using a templating language You don’t always want to output strings, so let’s use Twig, because it’s awesome. { "require": { "silex/silex": "1.0.*@dev", "twig/twig": ">=1.8,<2.0-dev", "symfony/twig-bridge": "~2.1" } } Sunday, 21 April 13
  • 10. Register the Twig Service provider $app->register(new SilexProviderTwigServiceProvider(), array( ! 'twig.path' => __DIR__.'/views', )); Now to use it $app->get('/hello/{name}', function ($name) use ($app) { !return $app['twig']->render('hello.twig', array( ! 'name' => $name, )); }); Sunday, 21 April 13
  • 11. So many more Service providers Check the docs at http://silex.sensiolabs.org/documentation There are a boat load of Built-in Service Providers which you can take advantage of! Doctrine, Monolog, Form and Validation are just a couple of examples. Sunday, 21 April 13
  • 12. Tips: Extending the base application This allows you to add, anything to the base application to make your own life easier. First of all, you need a class <?php namespace Acme; use SilexApplication as BaseApplication; class Application extends BaseApplication { } Sunday, 21 April 13
  • 13. Tips: Extending the base application Now time to autoload that class, psr-0 style. { "require": { "silex/silex": "1.0.*@dev", "twig/twig": ">=1.8,<2.0-dev", "symfony/twig-bridge": "~2.1"! }, "autoload": { "psr-0": {"Acme": "src/"} } } Sunday, 21 April 13
  • 14. Tips: Separate your config and routes app/bootstrap.php require_once __DIR__ . '/../vendor/autoload.php'; use ! SymfonyComponentHttpFoundationRequest, ! SymfonyComponentHttpFoundationResponse; use ! AcmeApplication; $app = new Application; $app->register(new SilexProviderTwigServiceProvider(), array( ! 'twig.path' => __DIR__.'/views', )); return $app; Sunday, 21 April 13
  • 15. Tips: Separate your config and routes web/index.php <?php $app = include __DIR__ . '/../app/bootstrap.php'; $app->get('/hello/{name}', function ($name) use ($app) { return $app['twig']->render('hello.twig', array( 'name' => $name, )); }); $app->run(); Sunday, 21 April 13
  • 16. Let's make an API Silex is great for API's, so let's make one. Here is the groundwork for a basic user-based API Some lovely endpoints: Create a user (/user) - This will use POST to create a new user in the DB. Update a user (/user/{id}) - This will use PUT to update the user View a user (/user/{id}) - This will use GET to view the users information Delete a user (/user/{id}) - Yes you guessed it, this uses the DELETE method. Sunday, 21 April 13
  • 17. More dependencies! If we want to use a database, we'll need to define one. Let's get DBAL! { "require": { "silex/silex": "1.0.*@dev", "twig/twig": ">=1.8,<2.0-dev", "symfony/twig-bridge": "~2.1", "doctrine/dbal": "2.2.*" }, "autoload": { "psr-0": {"Acme": "src/"} } } Sunday, 21 April 13
  • 18. More dependencies! It'll just be MySQL so let's configure that $app->register(new DoctrineServiceProvider(), array( ! 'db.options' => array( ! ! 'dbname' ! => 'acme', ! ! 'user' ! ! => 'root', ! ! 'password' ! => 'root', ! ! 'host' ! ! => 'localhost', ! ! 'driver' ! => 'pdo_mysql', ! ), )); Sunday, 21 April 13
  • 19. Show me your endpoints: POST Before we can do anything, we need to create some users. $app->post('/user', function (Request $request) use ($app) { $user = array( 'email' => $request->get('email'), ! 'name' => $request->get('name') ); $app['db']->insert('user', $user); return new Response("User " . $app['db']->lastInsertId() . " created", 201); }); Sunday, 21 April 13
  • 20. Show me your endpoints: PUT To update the users, we need to use PUT $app->put('/user/{id}', function (Request $request, $id) use ($app) { $sql = "UPDATE user SET email = ?, name = ? WHERE id = ?"; $app['db']->executeUpdate($sql, array( $request->get('email'), $request->get('name'), (int) $id) ); ! return new Response("User " . $id . " updated", 303); }); Sunday, 21 April 13
  • 21. Show me your endpoints: GET Let's get the API to output the user data as JSON $app->get('/user/{id}', function (Request $request, $id) use ($app) { $sql = "SELECT * FROM user WHERE id = ?"; $post = $app['db']->fetchAssoc($sql, array((int) $id)); return $app->json($post, 201); }); Sunday, 21 April 13
  • 22. Show me your endpoints: DELETE Lastly, we have DELETE $app->delete('/user/{id}', function (Request $request, $id) use ($app) { $sql = "DELETE FROM user WHERE id = ?"; $app['db']->executeUpdate($sql, array((int) $id)); return new Response("User " . $id . " deleted", 303); }); Sunday, 21 April 13
  • 23. A note about match() Using match, you can catch any method used on a route. Like so: $app->match('/user', function () use ($app) { ! ... }); You can also limit the method accepted by match by using the 'method' method $app->match('/user', function () use ($app) { ! ... })->method('PUT|POST'); Sunday, 21 April 13
  • 24. Using before() and after() Each request, can be pre, or post processed. In this case, it could be used for auth. $before = function (Request $request) use ($app) { ... }; $after = function (Request $request) use ($app) { ... }; $app->match('/user', function () use ($app) { ... }) ->before($before) ->after($after); Sunday, 21 April 13
  • 25. Using before() and after() This can also be used globally, like so: $app->before(function(Request $request) use ($app) { ... }); You can also make an event be as early as possible, or as late as possible by using Application::EARLY_EVENT and Application::LATE_EVENT, respectively. $app->before(function(Request $request) use ($app) { ... }, Application::EARLY_EVENT); Sunday, 21 April 13
  • 26. Time for a demo Sunday, 21 April 13
  • 27. Summary This is just a small amount of what Silex is capable of, try it out. Thank You! http://silex.sensiolabs.org/ @chrisdkemper http://chrisdkemper.co.uk Sunday, 21 April 13