Scaling Silex applications (part II). Using RouteCollection
In the post Scaling Silex applications I wanted to organize a one Silex application. In one comment Igor Wiedler recommended us to use RouteCollections instead of define the routes with a Symfony’s Dependency Injection Container. Because of that I started to hack a little bit about it and here I show you my outcomes:
I want to build an imaginary application with silex. This application has also one Api and one little blog. I want to organize those parts. Our index.php file
<?php
// www/index.php
require_once __DIR__ . '/../vendor/autoload.php';
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\RouteCollection;
use Silex\Application;
$app = new Application();
$app['routes'] = $app->extend('routes', function (RouteCollection $routes, Application $app) {
$loader = new YamlFileLoader(new FileLocator(__DIR__ . '/../config'));
$collection = $loader->load('routes.yml');
$routes->addCollection($collection);
return $routes;
});
$app->run();
Now our routes.yml file:
# config/routes.yml
home:
path: /
defaults: { _controller: 'Gonzalo123\AppController::homeAction' }
hello:
path: /hello/{name}
defaults: { _controller: 'Gonzalo123\AppController::helloAction' }
api:
prefix: /api
resource: api.yml
blog:
prefix: /blog
resource: blog.yml
As we can see we have separated the main routing file into different files: api.yml (for the Api) and blog.yml (for the blog)
# config/api.yml
api.list:
path: /list
defaults: { _controller: 'Gonzalo123\ApiController::listAction' }
# blog.yml
blog.home:
path: /
defaults: { _controller: 'Gonzalo123\BlogController::homeAction' }
And now we can create our controllers:
<?php
// lib/Gonzalo123/AppController.php
namespace Gonzalo123;
use Symfony\Component\HttpFoundation\Response;
use Silex\Application;
class AppController
{
public function homeAction()
{
return new Response("AppController::homeAction");
}
public function helloAction(Application $app, $name)
{
return new Response("Hello" . $app->escape($name));
}
}
<?php
// lib/Gonzalo123/ApiController.php
namespace Gonzalo123;
use Symfony\Component\HttpFoundation\Response;
class ApiController
{
public function listAction()
{
return new Response("AppController::listAction");
}
}
<?php
// lib/Gonzalo123/BlogController.php
namespace Gonzalo123;
use Symfony\Component\HttpFoundation\Response;
class BlogController
{
public function homeAction()
{
return new Response("BlogController::homeAction");
}
}
And that’s all. Here also the needed dependencies within our composer.json file
{
"require":{
"silex/silex":"1.0.*@dev",
"symfony/yaml":"v2.2.0",
"symfony/config":"v2.2.0"
},
"autoload":{
"psr-0":{
"":"lib/"
}
}
}
source code at github.
Posted on March 4, 2013, in php, silex, Symfony, Technology and tagged php, silex, Symfony. Bookmark the permalink. 8 Comments.
























whether it enables the system to create a bundle using Silex
i try to add weprofierProvider like this :
// web profiler service
$app->register($profiler = new \Silex\Provider\WebProfilerServiceProvider(), array(
‘profiler.cache_dir’ => __DIR__.’/../cache’,
));
$app->mount(‘/_profiler’, $profiler);
but this make an error:
Twig_Error_Syntax: The function “path” does not exist in “@WebProfiler/Profiler/toolbar_js.html.twig” at line 15
I don’t understand your problem. It looks that it’s out of the scope of this post. To use the WebProfilerServiceProvider you need to follow the instructions that appear within the WebProfilerServiceProvider documentation. It works without problems.
Good solution. Thanks.
But how can i set and use custom vars (ex. layouts) for any routes/collections in yaml file?
And what about middlewares?
AFAIK we can use all the functionality defined within the routing component fo sf2. http://symfony.com/doc/2.0/book/routing.html. I must check out how to handle middlewares. The approach of the firsr article writes a silex app from a YAML file. That’s cool because we can do all the things that Silex does, But it’s bad because we need to code them. This second approach uses one existing component. It looks smarter, but I need to invetigate your question about middlewares
Hi , i resolved the middleware issue on the previous article about scaling silex, check the comments. regards !
Pingback: Новости » Blog Archive » Дайджест интересных новостей и материалов из мира PHP за последние две недели №12 (25.02.2013 — 11.03.2013)
Pingback: Новости » Blog Archive » Дайджест интересных новостей и материалов из мира PHP за последние две недели №12 (25.02.2013 — 11.03.2013)