Маршрутизация в Silex / Symfony.Предоставление маршрута по умолчанию - PullRequest
8 голосов
/ 14 июля 2011

Я пытаюсь что-то сделать, используя Silex (который использует компонент маршрутизации Symfony - поэтому ответ может быть применим и к Symfony)

Я добавляю Silex в устаревшее приложение для обеспечения маршрутизации, но мне нужно уважать реализацию по умолчанию для загрузки файлов в существующих приложениях (то есть просто загрузить файл из файловой системы по указанному URL-адресу).

изменить: для уточнения: Существующий файл загружается из файловой системы как включение в родительский шаблон после серии вызовов начальной загрузки.

Что я обнаружил, так это то, что в отсутствие определенного маршрута для соответствия устаревшим страницам Silex выдает исключение.

Мне действительно нужен способ предоставить механизм по умолчанию (резервный) для обработки этих устаревших страниц - но мой шаблон должен соответствовать всему URL (а не только одному фрагменту).

Возможно ли это?

// 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();

Это должен быть общий случай использования. Я пытаюсь предоставить способ иметь интерфейс RESTFUL вместе с устаревшим кодом (load /myfolder/mysubfolder/my_php_script.php)

Ответы [ 2 ]

28 голосов
/ 14 июля 2011

Я нашел ответ в кулинарной книге Symfony ...

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

$app->match('{url}', function($url){
    //do legacy stuff
})->assert('url', '.+');
4 голосов
/ 14 июля 2011

Вы можете использовать обработку ошибок, например:

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);
});
...