9

Silex を使用して何かをしようとしています (これは Symfony ルーティング コンポーネントを使用するため、答えは Symfony にも当てはまる可能性があります)。

ルーティングを提供するためにレガシー アプリケーションに Silex を追加していますが、ファイルをロードするための既存のアプリケーションのデフォルトの実装を尊重する必要があります (指定された URL からファイル システムからファイルをロードするだけです)。

編集: 明確化のために: 既存のファイルは、一連のブートストラップ呼び出しが行われた後、親テンプレート内のインクルードとしてファイル システムから読み込まれます。

私が見つけたのは、従来のページに一致するように定義されたルートがない場合、Silex が例外をスローしていることです。

これらのレガシー ページを処理するためのデフォルト (フォールバック) メカニズムを提供する方法が本当に必要ですが、パターンは URL 全体 (1 つのフラグメントだけでなく) と一致する必要があります。

これは可能ですか?

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

4

2 に答える 2

29

答えはsymfonyクックブックで見つけました...

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

$app->match('{url}', function($url){
    //do legacy stuff
})->assert('url', '.+');
于 2011-07-14T17:25:50.273 に答える
4

次のようなエラー処理を使用できます。

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);
});
于 2011-07-14T13:56:04.580 に答える