2013-07-28 1 views
5

Ich versuche, eine wiederverwendbare Funktion zu machen, aber jedes Mal, wenn ich versuche, $ app in der Remote-Funktion zu verwenden, bekomme ich einen leeren Bildschirm. Hier ist, was funktioniert:

$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() .'}}'; 
    } 
} 

Aber ich versuche, den json-Header in der Funktion zu bewegen und kann das nicht an der Arbeit (bekommt den leeren weißen Bildschirm):

$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() .'}}'; 
    } 
} 

Ist etwas falsch mit meiner Syntax oder wie verwende ich PHP? Ich habe auch ohne die "Use ($ app)" überhaupt versucht aber immer noch das gleiche Problem.

+0

Sie erhalten einen Fehler, da Sie eine leere Seite erhalten. – Perry

Antwort

13

Einfache Möglichkeit, dies zu beheben, ist die Verwendung von getInstance();

+0

Danke für Ihr Stück Code .. – Dibish

+0

Hallo danke für diesen Code es funktioniert. Aber ich bin ein PHP-Neuling kann jemand hier überprüfen, ist dies der richtige Weg, es zu tun. – Ananda

+0

ja, schlanke Entwickler speziell erstellen die Methode getInstance, so dass $ app in Funktion verwendet werden kann –

0

Das Schlüsselwort use gilt nur für Abschlusskonstrukte, abgesehen von der Verwendung mit Namespaces. Was Sie mit einer normalen Funktion machen, wird nicht unterstützt. Sie müssen global $app verwenden, was normalerweise als schlechte Praxis angesehen wird.

5

Sie könnten das Objekt $ app immer als Argument an Ihre Funktion übergeben.

$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

Gibt es einen anderen Weg, es zu tun? Momentan übergebe ich $ app object als Argument. Ich weiß nicht, ob es der richtige Weg ist. – Dibish

+1

Warum nicht? Ihre einzige andere Alternative besteht darin, mit einer globalen Deklaration auf das Slim-Objekt zuzugreifen. Normalerweise möchten Sie keine globalen Variablen verwenden. Das Slim-Objekt als Parameter übergeben ist ein Muster namens [Dependency Injection] (http://en.wikipedia.org/wiki/Dependency_injection). DI ist eine gute Vorgehensweise, da es den Code in einer Funktion von den Abhängigkeiten entkoppelt, auf denen er beruht. – maxiscool

+0

Vielen Dank für Ihre Informationen – Dibish

2

Es ist sauberer, Datenbankaufrufe und App-Logik/Präsentation getrennt zu halten. Ich würde Ihr "Kapitel" -Objekt sofort zurückgeben und alles andere außerhalb der executeSql-Funktion behandeln.

$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() .'}}'; 
    } 
} 
Verwandte Themen