2013-07-28 43 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?我也試過沒有「使用($ app)」,但仍然是同樣的問題。

+0

你得到任何錯誤,因爲你得到一個空白頁。 – Perry

回答

13

解決此問題的簡單方法是使用getInstance();

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

感謝您的代碼片段。 – Dibish

+0

嗨,感謝您使用此代碼。但我是一個PHP新手可以在這裏驗證是否這是正確的方式來做到這一點。 – Ananda

+0

是的,Slim開發者專門創建了getInstance方法,以便$ app可以在函數中使用 –

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對象作爲參數是一種稱爲[依賴注入](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() .'}}'; 
    } 
} 
相關問題