2012-01-28 2 views
2

들어오는 아약스 요청을 처리하는 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 및 유사한 opcode 캐시가 작동하지 않습니다. – neph

+0

@neph 아니요, APC는 정상적으로 작동합니다. http://stackoverflow.com/a/1396538/453331 참조하십시오. – kba

+0

'__autoload()'는 "일종의"비추천입니다. 당신은'spl_autoload_register()'를 사용해야한다. 이것은 꽤 비슷하게 작동하며 (끝에서) 똑같이 작동한다. – KingCrunch

0

시도, 당신은 실제 액션/방법 매핑 코드

관련 문제