2013-07-28 2 views
5

재사용 가능한 함수를 만들려고하는데 원격 함수에서 $ app을 사용할 때마다 빈 화면이 나타납니다.

$app = new \Slim\Slim(); 

//GET CHAPTERS 
$app->get(
    '/chapters', 
    function() use ($app) { 
     $app->contentType('application/json'); 
     executeSql('SELECT * FROM chapters ORDER BY id'); 
    } 
); 

//GENERIC SQL EXECUTE 
function executeSql($sql) { 
    try { 
     $db = getConnection(); 
     $stmt = $db->query($sql); 
     $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($results); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

하지만이 함수에서 JSON 헤더를 이동하려고하고이 동작하지 않습니다합니다 (빈 화면을 얻는다) :

$app = new \Slim\Slim(); 

//GET CHAPTERS 
$app->get(
    '/chapters', 
    function() { 
     executeSql('SELECT * FROM chapters ORDER BY id'); 
    } 
); 

//GENERIC SQL EXECUTE 
function executeSql($sql) use ($app) { 
     $app->contentType('application/json'); 
    try { 
     $db = getConnection(); 
     $stmt = $db->query($sql); 
     $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($results); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

인가 뭔가 여기에 작업을 수행 무엇인가 구문이 잘못되었거나 PHP를 어떻게 사용하고 있습니까? 나는 "use ($ app)"를 사용하지 않고 시도했지만 여전히 같은 문제가있다.

+0

빈 페이지가 생기면 오류가 발생합니까? – Perry

답변

13

쉬운 방법은 getInstance()를 사용하는 것입니다.

function yourFunction(){ 
    $app = \Slim\Slim::getInstance(); 
} 
+0

코드 조각을 주셔서 감사합니다. – Dibish

+0

안녕하세요,이 코드 덕분에 잘 작동합니다. 하지만 저는 PHP 초보자입니다. 여기에있는 사람은 누구나 할 수있는 올바른 방법입니다. – Ananda

+0

예, 슬림 개발자가 특별히 $ app을 함수에서 사용할 수 있도록 getInstance 메소드를 만듭니다. –

0

use 키워드는 네임 스페이스와 함께 사용하지 않고 클로저 구문에만 적용됩니다. 그래서 정규 함수로하는 것은 지원되지 않습니다. 일반적으로 나쁜 습관으로 간주되는 global $app을 사용해야합니다.

5

항상 $ app 객체를 함수의 인수로 전달할 수 있습니다.

$app = new \Slim\Slim(); 

//GET CHAPTERS 
$app->get(
    '/chapters', 
    function() use ($app) { 
     executeSql($app, 'SELECT * FROM chapters ORDER BY id'); 
    } 
); 

//GENERIC SQL EXECUTE 
function executeSql(\Slim\Slim $app, $sql) { 
     $app->contentType('application/json'); 
    try { 
     $db = getConnection(); 
     $stmt = $db->query($sql); 
     $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($results); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 
+0

다른 방법이 있습니까? 현재 $ app 객체를 인수로 전달 중입니다. 나는 그것을 할 올바른 방법인지 모른다. – Dibish

+1

왜 안되니? 유일한 다른 대안은 전역 선언으로 Slim 개체에 액세스하는 것입니다. 일반적으로 전역 변수를 사용하지 않으려합니다. Slim 객체를 매개 변수로 전달하는 패턴은 [Dependency Injection] (http://en.wikipedia.org/wiki/Dependency_injection) 패턴입니다. DI는 의존하는 의존 관계에서 함수의 코드를 분리하기 때문에 따르기 좋은 연습입니다. – maxiscool

+0

감사합니다. – Dibish

2

데이터베이스 호출과 응용 프로그램 논리/프리젠 테이션을 별도로 유지하는 것이 더 깔끔합니다. "챕터"객체를 즉시 반환하고 executeSql 함수 외부의 다른 것을 처리합니다.

$app = new \Slim\Slim(); 

// GET CHAPTERS 
$app->get('/chapters', function() use ($app) { 

    $app->contentType('application/json'); 

    $chapters = executeSql('SELECT * FROM chapters ORDER BY id'); 

    if ($chapters) { 
    $app->response->setStatus(200); 
    echo json_encode($results); 
    } else { 
    $app->response->setStatus(400); 
    echo '{"error":{"text":"error getting chapters"}}'; 
    } 

}); 

// GENERIC SQL EXECUTE 
function executeSql($sql) { 
    try { 
    $db = getConnection(); 
    $stmt = $db->query($sql); 
    $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
    $db = null; 
    return $results; 
    } catch(PDOException $e) { 
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
}