2012-01-28 4 views
2

私は受け取ったajaxリクエストを処理するphpのFrontcontrollerでより大きなアプリケーションを持っています。私は、Action-> Methodマッピングを扱う良い方法について考えています。このコントローラーは、他のクラスをインスタンス化してそこでメソッドを実行することを担当しています。フロントコントローラーで大規模なswitch文を避ける

スイッチがちょうど大きくなりすぎて、醜いです。私は配列を作成し、簡単にやって考えていた:

if(in_array($action, $methodmap)){ 
    $methodmap[$action](); 
}  

しかしがわからないどのように効率的であるか、または任意の他のより良い代替手段がある場合には、このコントローラは、着信要求の全体の多くを処理するので、パフォーマンスが重要であるということ。

ありがとうございます!代わりに、「ルーティング」の設定ファイルを使用して

+0

あなたは 'ISSET()'場所で使用するため、出力、と呼ばれることになりますin_array()の。また、スイッチ上のハッシュマップの速度差は、(場合によっては測定可能です)(http://xdebug.org/docs/profiler)。 – mario

答えて

2

を変更することなく、アプリケーションに新しいルーティングを追加することができます。

のindex.php

<?php 

class InvalidClassException extends Exception {} 
function autoloader($class) 
{ 
    $path = 'controllers/'.$class.'.php'; 
    if (!ctype_alnum($class) || !file_exists($path)) 
     throw new InvalidClassException("Couldn't find '$class'"); 
    require($path); 
} 
spl_autoload_register('autoloader'); 

$request = isset($_GET['request'])?$_GET['request']:'front'; 
$controller = new $request(); 
$controller->index(); 

そして、あなたは、すべてのコントローラを保存するディレクトリcontrollers/。例えば。

コントローラ/ test1.php

<?php 

class Test1 
{ 
    public function index() 
    { 
     print "Test 1"; 
    } 
} 

index.php?request=test1にアクセスし、Test1->index()

テスト1

+0

私はそれをやっているのですが、私がこれをしなかった理由は:http://pooteeweet.org/blog/538、私は今日までどのように真実かわかりませんが、それは真実ではありません__autoloadを使用すると、基本的にapcや同様のオペコードキャッシュで不運になりますか? – neph

+0

@nephいいえ、APCは正常に動作します。 http://stackoverflow.com/a/1396538/453331を参照してください。 – kba

+0

'__autoload()'は推奨されていません。 'spl_autoload_register()'を使うべきです。これはまったく同じように動作し、(最後は)まったく同じです。 – KingCrunch

0

TRY ...その方法は、あなたは、単純なルーティングシステムを作成することができ、実際のアクション/メソッドのマッピングコード

関連する問題