Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Routing in Silex/Symfony. Providing a default route

I'm attempting to do something using Silex (which uses the Symfony routing component - so the answer may be applicable to Symfony as well)

I am adding Silex to a legacy application to provide routing but I need to respect the existing applications default implementation for loading files (which is simply to load the file from the file system form the URL specified).

edit: for clarification: Existing file is loaded from the file system, as an include within an parent template, after a series of bootstrapping calls have been made.

What I'm finding is that in the absence of a defined route to match the legacy pages, Silex is throwing an exception.

I really need a way to provide a default (fallback) mechanism for handling those legacy pages - but my pattern has to match the entire url (not just one fragment).

Is this possible?

// Include Silex for routing    
require_once(CLASS_PATH . 'Silex/silex.phar');

// Init Silex
$app = new Silex\Application();

    // route for new code
    // matches for new restful interface (like /category/add/mynewcategory)

    $app->match('/category/{action}/{name}/', function($action, $name){
        //do RESTFUL things
    });

    // route for legacy code (If I leave this out then Silex
    // throws an exception beacuse it hasn't matched any routes

    $app->match('{match_the_entire_url_including_slashes}', function($match_the_entire_url_including_slashes){
        //do legacy stuff
    });

    $app->run();

This must be a common use case. I'm trying to provide a way to have a RESTFUL interface alongside legacy code (load /myfolder/mysubfolder/my_php_script.php)

like image 837
calumbrodie Avatar asked Jul 14 '11 13:07

calumbrodie


People also ask

How can default route be generated?

Default routes can also be generated by dynamic routing protocols, such as OSPF and IS-IS. Default routes are used only when no matching routing entry is available for packet forwarding in the routing table. A default route in the routing table is the route to the network 0.0.

What is the default routing configuration file in Symfony application?

By default, the routing configuration file in a Symfony2 application is located at app/config/routing. yml. Like all configuration in Symfony2, you can also choose to use XML or PHP out of the box to configure routes.

How does Symfony routing work?

Symfony provides a Routing component which allows us, for a HTTP request/URL, to execute a specific function (also known as "Controller"). Note: Controllers must be a callable, for example: an anonymous function: $controller = function (Request $request) { return new Response() }; .


2 Answers

I found the answer within the symfony cookbook...

http://symfony.com/doc/2.0/cookbook/routing/slash_in_parameter.html

$app->match('{url}', function($url){
    //do legacy stuff
})->assert('url', '.+');
like image 134
calumbrodie Avatar answered Oct 12 '22 02:10

calumbrodie


You can use the error handling, with something like that :

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

$app->error(function (\Exception $e) use ($app) {
if ($e instanceof NotFoundHttpException) {
        return new Response('The requested page could not be found. '.$app['request']->getRequestUri(), 404);
    }
    $code = ($e instanceof HttpException) ? $e->getStatusCode() : 500;
    return new Response('We are sorry, but something went terribly wrong.', $code);
});
like image 24
Charles Avatar answered Oct 12 '22 02:10

Charles