Symfony_routename_converter is a project mainly written in Shell, based on the Apache-2.0 license.
Symfonyプロジェクトで、URL中の 'module/action.. を '@ルーティング名.. に一括変換するスクリプト
====================================================== symfony_routename_converter
Symfonyプロジェクトで、URL中の 'module/action.. を '@ルーティング名.. に一括変換するPHPスクリプト
by [email protected]
======================================================
■これは何
url_for や link_to などの引数で 'module/action?id=' のように指定をすると 該当するアクションをSymfonyがルーティングテーブルを頭から1つずつ比較して探していき遅くなるので、 Symfonyでは'@module_action?id=' のようなルーティング名を設定してそれを使うことが推奨されています。
とはいえ実際のコードには module/action 方式で記述された部分が少なくなく、これを手で1つ1つ書き直していくのは面倒だし、間違える可能性もあるのでこれを一括変換するスクリプト群を用意することにしました。
$ php routename_auto_converter.php . pc_frontend
のようにアプリケーション名を指定して起動します。
■スクリプト群
・routename_auto_converter.php ... ルーティング名一括変換スクリプト。 symfony app:routes から抽出したルーティング情報をもとに自動変換スクリプト(sed)を生成した後、 対象となるソースファイル(/test/ 以下を除く)を find で拾い出し、sed -i でインプレイス置換します。 (sed の -i オプションが使えない環境では inplace_conv.sh を参考にしてください) symfony app:routes で情報を取得するため、割と時間がかかります。(OpenPNEだと1アプリあたり50〜60分とか)
■生成されるファイル
・${APP_ROOT}/.${APP_NAME}_routename_converter.sed ... 一括変換スクリプト
■中でやっていること
アプリケーションのルーティング情報は
$ ./symfony app:routes
で取得した後、個々のルート名について
$ ./symfony app:routes
でさらに詳細な情報を得ています。この情報取得部分で1アプリケーションあたり1時間弱(※作者環境の場合)かかります。 こうして得た情報から、一括変換に用いるsedスクリプトを生成し、find で適用対象ファイルを絞り込んだ後にsed -iでインプレイス適用します。
■注意点
同じアクションに対し複数のルーティング名が登録されている場合 → 必須パラメータを軽くチェックして善きに計らいます。
複数のアクション名に対し同じルーティング名が登録されている場合 → 同じルーティング名にされてしまうので気をつけてね
■ライセンス
LICENSE.txt参照
■履歴
2010/08/20 初期バージョン 2010/08/20 testディレクトリ以下を置換対象から外す 2010/08/24 include_partialを対象外にする 2010/10/13 PHPで書き直し、ファイルを一本化