2011-06-28 9 views
1

注釈に基づいたルーティングシステムを作成しようとしています(Recess Frameworkのようなもの)。PHPルーティングシステム

1)それは良いアイデアです:私はhttp://domain.com/hello/James/Bondに行けば

<?php 

class MyController extends ActionController { 

    /** !Route GET /hello/$firstname/$lastname **/ 
    public function helloAction($firstname, $lastname) { 
     echo('Hello '.$firstname.' '.$lastname); 
    } 
} 

?> 

私は、だから私は二つの質問を持っている

Hello James Bond 

を取得しますか?中央ルーティングシステム(Zend Frameworkのような)と長所と短所。多分私はこのルーティング技術で私の問題が発生することはありません。ルート

<?php 

class MyController extends ActionController { 

    /** 
    *!Route GET /test/$id = { 
    * id: [a-z0-9] 
    *} 
    **/ 
    public function testAction($id) { 
     echo($id); 
    } 

    /** 
    *!Route GET /test/$id = { 
    * id: [0-9a-z] 
    *} 
    **/ 
    public function otherTestAction($id) { 
     echo($id); 
    } 
} 

?> 

での正規表現は、私は2つのルートを取得している場合は、重複するルートの確認方法

2):/test/[a-z0-9]//test/[0-9a-z]/と私はhttp://domain.com/test/a12/に行けば両方のルートが有効です。

感謝:)

答えて

1

短所:

  • あなたのサーバー内のすべてのメソッドのURLマッピングの概要を維持することは困難です。
  • URLを変更するには、ソースコードを変更する必要があります。マッピングはアプリケーションから切り離されません。

例として、関連として、メソッドのシグネチャとマッピングが常にある場合は、helloActionと/ハローとしてピックアップし、各メソッドの引数は、このディレクトリのサブディレクトリですマッピングを抽出するためにリフレクションを使用する場合があります彼らが定義しているように

その後注釈は、この方法は、エンドポイント、このようなものであるという事実のみ、URLを複製する必要はありません。

<?php 
    class MyController extends ActionController { 

     /** !endpoint(method=GET) **/ 
     public function helloAction($firstname, $lastname) { 
      echo('Hello '.$firstname.' '.$lastname); 
     } 
} 
+0

+1。私はそれを考慮する。ありがとう – Tomas

0
  1. 私はコードとエントリポイントをデカップリングすることはほとんどどこでも

  2. 通常、あなたがそれをチェックしません使用しているようだ/それは良いアイデアだと思う:一致した最初のものを勝つ。そう

+0

エラーを検出するのが困難ではなく、重複したルートであり、実際に予想した以外のアクションが実行されますか? – Tomas

+0

コードにエンドポイントが含まれているので、これはコードエンドポイントをデカップリングしません。 – Kwebble

+0

@thomas:通常デバッグでは、どのアクションが実行されたかを検出できるはずですので、問題ではありません。 – Arend

0

は、限り、あなたは生産でコンパイルされたルートをキャッシュとして素晴らしいアイデア、です。ルーティング時にファイルを解析するためのコストが発生するため、開発しないときには避ける必要があります。

重複をチェックする場合は、宣言を比較してチェックしないでください。ルーティングの際にチェックするだけです。 2つのルールが一致する場合は、DuplicateRouteExceptionを投げる。したがって、http://domain.com/test/a12/をルーティングすると、両方のルートが有効であり、例外がスローされることがわかります。

+0

私はそうは思わないすべてのルートをテストするのが難しく、実動モードのユーザーが 'DuplicateRouteException'を表示しないようにする必要があるため、ルーティング時に重複したルートがないかチェックしてください。 – Tomas

+0

@Tomas:正規表現 '/ test/[0-9] +'と '/ test/[az] * [0-9] +'が2つの異なる非正規表現であれば、重複をテストする唯一の方法です同等の正規表現で重複したルートにつながる可能性があります。本番環境では、エラーハンドラはトラフィックをエラーページにルーティングするだけです( '' Oups、何かが間違っていました)。例外を記録します。興味深い考えのために+1 –

2

均一に解析するためにはるかに簡単であるべきJava annotation formatを使用してみてください。

それはこのようなものになります。

<?php 
class MyController extends ActionController { 

    /** 
     @Route(get=/hello/$firstname/$lastname) 
     @OtherVal(var1=2,var2=foo) 
     @OtherVal2 
    **/ 
    public function helloAction($firstname, $lastname) { 
     echo('Hello '.$firstname.' '.$lastname); 
    } 
} 
?> 

をそして、次の正規表現を使用して注釈を解析:

@(?P<annotation>[A-Za-z0-9_]*)(\((?P<params>[^\)]*))? 

そしてもちろんのキャッシュこれらの可能な限り繰り返し解析を避けるために。