2013-11-03 2 views
2

데이터베이스 용으로 작은 RESTful API를 만들려고합니다. 모든 코드가 네임 스페이스를 사용하기 때문에 사용자 요청에 따라 동적으로 컨트롤러 객체를 만드는 데 문제가 발생했습니다. 하는 중 :다른 네임 스페이스를 가진 클래스에서 동적으로 새 객체를 만듭니다.

$api = new $controllerName($request); 

작동하지 않습니다. $controllerName가 "ReadController"를 해결하지만, 따라서 실제로 오류 \controllers\lottery\ReadController입니다 때문에 클래스의 경로를 정의의 전체 부분은

입니다

:

if ($method === 'GET') { 
    $controllerName = 'ReadController'; 
    // @NOTE: $category is a part of $_GET parameters, e.g: /api/lottery <- lottery is a $category 
    $controllerFile = CONTROLLERS.$category.'/'.$controllerName.'.php'; 
    if (file_exists($controllerFile)) { 
     include_once($controllerFile); 

     $api = new $controllerName($request); 
    } else { 
     throw new \Exception('Undefined controller'); 
    } 
} 

그리고 핵심 \ 컨트롤러에서 ReadController의 선언 \ 추첨 \ ReadController.php

namespace controllers\lottery; 

class ReadController extends \core\API { 

} 

동적으로 개체를 만드는 방법에 대한 아이디어가 있습니까?

감사합니다. 문자열에서 인스턴스화

답변

5
$controllerName = 'controllers\lottery\ReadController'; 
new $controllerName($request); 

클래스는 항상 정규화 된 클래스 이름을 사용해야합니다.

+0

간단 ... 젠장 .. 고마워, 효과가 있었다. 10 분 안에 답을 수락합니다. – deb0rian

+0

예, 비슷한 문제가있었습니다. 대답에 대한 유일한 개선점은 다음과 같습니다. PHP는 네임 스페이스 별칭을 해석에 대한 전체 경로로 대체하기 때문에 별칭은 opcode에서 유지되지 않으며 VM은 아무 것도 알지 못합니다. –

+0

@Alma 너무 자세하게 설명하는 방법이라고 생각합니다. http://stackoverflow.com/a/16808358/476 – deceze

관련 문제