2017-11-03 5 views
0

Ich entwickle derzeit eine RESTful-API, um eine Reihe von Datenbanken zu verwalten. Idealerweise sollte ich in der Lage sein, meine APIs Routen von einer anderen Route innerhalb meiner Anwendung aufzurufen, richtig?In einer Slim-API können keine vorhandenen internen Routen aufgerufen werden.

Ich habe versucht, subRequest zu verwenden, um eine bestehende Route vergebens aufzurufen. Alles, was ich bekommen, ist die folgende, während meine Route in Postman Ausführung:

<html> 
    <head> 
     <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
     <title>Slim Application Error</title> 
     <style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{display:inline-block;width:65px;}</style> 
    </head> 
    <body> 
     <h1>Slim Application Error</h1> 
     <p>A website error has occurred. Sorry for the temporary inconvenience.</p> 
    </body> 
</html> 

Hier sind meine companies.php API Routen alle Unternehmen in einem Tisch zu bekommen und ein neues Unternehmen in den companies Tisch zu legen.

<?php 
use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

// Get all companies 
$app->get('/companies', function(Request $request, Response $response) { 
    $sql = "SELECT * FROM companies"; 

    try { 
    // Get DB Object 
    $db = new db(); 
    // Connect 
    $db = $db->connect(); 

    $stmt = $db->query($sql); 
    $companies = $stmt->fetchAll(PDO::FETCH_OBJ); 
    $db = null; 

    echo '{"data":' . json_encode($companies) . '}'; 
    } catch(PDOException $e) { 
    echo '{"error": { "text":' . $e->getMessage() . '}}'; 
    } 
}); 

// Add new company to companies table 
$app->put('/new/company/{companyName}', function(Request $request, Response $response) { 
    $newCompany = $request->getAttribute('companyName'); 

    $insert_sql = "INSERT INTO companies (company_name) VALUE (:newCompany)"; 

    try { 
    $db = new db(); 
    $db = $db->connect(); 

    $insert_stmt = $db->prepare($insert_sql); 
    $newCompany = str_replace("'", "", $newCompany); 
    $insert_stmt->bindParam(':newCompany', $newCompany); 
    $insert_stmt->execute(); 

    $newID = $db->lastInsertId(); 
    $db = null; 

    echo '{"notice": {"text": "New Company Added (cid: '.$newID.')"}'; 
    } catch(PDOException $e) { 
    echo '{"error": { "text":' . $e->getMessage() . '}}'; 
    } 
}); 

Innerhalb einer anderen Route, sites.php, würde Ich mag den PUT->'/new/company' Weg laufen. Also, irgendwo innerhalb sites.php stelle ich folgende:

$destinationComp = "myNewCompany"; 
    $res = $this->subRequest('PUT', '/new/company/' . $destinationComp); 
    echo $res; 

Ich würde erwarten, meine Ausgabe gleich zu sein, als ob ich eine PUT-Anforderung manuell von Postman gemacht, anstelle des Fehlers in dem ersten Code-Abschnitt aufgeführt.

Außerdem habe ich versucht, meine Strecke Anruf zu modifizieren use ($app) in der Hoffnung, machen eine regelmäßige Anforderung durch die $app Variable eher umfassen als $this, ist Fall $this nicht funktioniert. Welche aussah:

Nur um die gleiche Fehlermeldung in Postman bei der Ausführung zu erhalten.

Irgendwelche Vorschläge?

Antwort

1

Sie versuchen, die Methode subRequest für die Klasse Container aufzurufen, wenn es sich um die Klasse App handelt.

innerhalb Streckensperrung wird $ this auf die Instanz Slim \ Container gebunden - Slim docs

Referenz die $ app var stattdessen injizieren es mit Verwendung Schlüsselwort. Geben Sie außerdem das Antwortobjekt zurück, anstatt ein Echo zu senden:

return $app->subRequest('PUT', '/new/company/' . $destinationComp); 
+0

Vielen Dank für den Fang. Offenbar, dass die einzige Permutation meines Setup habe ich nicht versucht, gutes Auge! –

+0

Ich habe seitdem Änderungen an meiner 'Firmen' API vorgenommen, so dass es Parameter verwendet, so dass die Erstellung einer neuen Firma eine PUT Anfrage an '/ company? Name = companyName' ist, es scheint, dass Ihre Empfehlung nicht mehr funktioniert. Ich kann auch keine Beispiele für subRequests finden, die irgendwo Parameter verwenden. –

+0

Sie sollten eine weitere Frage zum Stapelüberlauf stellen und Ihr Problem skizzieren. – Scriptonomy

Verwandte Themen